Autopsie chirurgicale du DOM. Locators parfaits. Code test prêt.
Un agent IA navigue. Un listener capture. L'IA nettoie. Tu reçois le code.
Framework-agnostique. Zéro record/replay. Zéro sélecteur fragile.
Les outils existants (Selenium IDE, Katalon Recorder, Cypress Studio) font du record/replay : ils enregistrent ce qu'ils voient, avec les sélecteurs qu'ils trouvent — souvent des XPath absolus ou des classes CSS générées qui cassent au premier refactoring.
DOMAutopsy fait de l'autopsie intelligente : un agent IA navigue comme un humain, un listener JS intercepte chaque interaction et applique une cascade de 7 niveaux de sélecteurs pour choisir le plus robuste. L'IA nettoie le bruit. Tu reçois du code prod.
| Selenium IDE | Katalon Recorder | DOMAutopsy | |
|---|---|---|---|
| Approche | Record/replay | Record/replay | Agent IA + DOM Listener |
| Sélecteurs | XPath absolu / CSS fragile | XPath / CSS | Cascade 7 niveaux, validée |
| Shadow DOM | ❌ | ❌ | ✅ natif |
| Nettoyage IA | ❌ | ❌ | ✅ GPT-4.1-mini |
| Output | Script propriétaire | Script Katalon | JSON + Groovy + HTML |
| Prix | Gratuit | Gratuit | 0€ |
Le listener JS injecté dans le navigateur applique une cascade stricte à chaque clic et chaque input. Il choisit le sélecteur le plus robuste disponible, valide son unicité en temps réel, et remonte si nécessaire.
| Priorité | Stratégie | Exemples |
|---|---|---|
🟢 Tier 1 — data-testid · id · name |
Attributs stables — Priorité maximale. IDs sémantiques, attributs name, data-testid. Uniques par nature. |
#loginButton · [name="email"] · [data-testid="submit"] |
🔵 Tier 2 — aria-label · placeholder · title |
Attributs sémantiques (accessibilité) — Stables car porteurs de sens métier. Doublon accessibilité → automatisation, 1 pierre 2 coups. | [aria-label="Rechercher"] · input[placeholder="Email"] |
🩵 Tier 3 — href |
Liens par href — Uniquement si href non générique (#, /, javascript:void) et < 100 chars. |
a[href="/products/catalog"] |
🟣 Tier 4 — parent aria-label · parent data-testid |
Remontée au parent (icônes, SVG) — Si l'élément cliqué est une icône ou un SVG sans attribut, remonte au parent interactif porteur de sens via closest(). |
[aria-label="Fermer le menu"] |
🟡 Tier 5 — label XPath |
Label associé (inputs) — Pour les inputs sans attribut stable, trouve le <label for> ou <label> wrapping. |
//label[contains(text(),"Mot de passe")]//input |
🔴 Tier 6 — CSS court · XPath texte |
Dernier recours — CSS court (max 2 classes stables + nth-of-type). Si multi-match, tentative XPath texte. | button.btn-primary:nth-of-type(2) · //button[contains(text(),"Valider")] |
🟤 Shadow DOM — chaîne >>> |
Détection automatique — Construction de la chaîne avec >>> (Playwright) et .shadowRoot.querySelector() (JS). |
my-component >>> [aria-label="Submit"] |
Validation temps réel : chaque sélecteur est validé via querySelectorAll ou XPathResult. Si matchCount > 1, le listener tente automatiquement un XPath texte avant de passer en Tier 6.
git clone https://github.com/julienmerconsulting/DOMAutopsy
cd DOMAutopsy
pip install -r requirements.txt
playwright install chromiumPrérequis : Python 3.12+ (PySide6 ne supporte pas les versions antérieures)
Configurer la clé API :
cp .env.example .env
# Éditer .env avec ta clé OPENAI_API_KEYpython scenario_builder.pyInterface graphique pour construire le scénario étape par étape : navigate, click, input, verify, scroll, hover, wait, screenshot, cookie. Export JSON + lancement direct de qa_explorer.
python qa_explorer.py mon_scenario.jsonpython qa_explorer.py --url https://example.com --task "Clique sur Login, remplis email avec test@test.com, clique sur Connexion"┌─────────────────────────────────┐
│ scenario_builder.py (PySide6) │ ← Construction visuelle du scénario
│ 10 types d'actions │
└────────────┬────────────────────┘
│ JSON
▼
┌─────────────────────────────────┐
│ qa_explorer.py │
│ ├── Lance Chromium (CDP 9222) │ ← Playwright
│ ├── Injecte DOM Listener V3 │ ← Capture clics + inputs + scrolls
│ ├── browser-use navigue │ ← Agent IA GPT-4.1-mini
│ ├── Récupère localStorage │ ← Log brut des locators
│ ├── Déduplique inputs/clics │ ← Garde dernière valeur par champ
│ └── Nettoyage IA │ ← Filtre bruit, ordonne steps
└────────────┬────────────────────┘
│
┌───────┼───────────┐
▼ ▼ ▼
JSON Groovy HTML
brut Katalon Rapport
| Fichier | Contenu |
|---|---|
locator_log_TIMESTAMP.json |
Log brut capturé (tous les events) |
clean_steps_TIMESTAMP.json |
Parcours nettoyé par l'IA (steps + anomalies) |
katalon_test_TIMESTAMP.groovy |
Code Katalon Studio prêt à coller |
qa_report_TIMESTAMP.html |
Rapport interactif (Charts.js, dark theme) |
{
"step": 3,
"action": "click",
"description": "Clique sur le bouton Connexion",
"selector": "[aria-label='Se connecter']",
"selectorType": "css",
"unique": true,
"page": "https://example.com/login"
}import com.kms.katalon.core.testobject.TestObject
import com.kms.katalon.core.testobject.ConditionType
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
// Etape 3 : Clique sur le bouton Connexion
TestObject btnConnexion = new TestObject("btnConnexion")
btnConnexion.addProperty("css", ConditionType.EQUALS, "[aria-label='Se connecter']")
WebUI.verifyElementPresent(btnConnexion, 10)
WebUI.click(btnConnexion)
WebUI.delay(1)Le rapport interactif généré par report_generator.py inclut :
- KPIs : steps nettoyés, actions capturées, sélecteurs uniques/non-uniques, anomalies
- 3 piecharts : stratégies de sélection, fiabilité (unique vs non-unique), types d'actions
- Tableau des steps nettoyés avec badges de sévérité
- Log brut dédupliqué avec tier et stratégie par entrée
- Code Katalon affiché avec coloration syntaxique
- Thème dark cohérent avec la suite Lens
DOMAutopsy
│
├── qa_explorer.py # Pipeline principal : Chromium + listener + browser-use + IA
├── scenario_builder.py # GUI PySide6 : constructeur de scénarios
├── report_generator.py # Rapport HTML interactif (Chart.js)
├── .env.example # Template variables d'environnement
├── requirements.txt # Dépendances pip
└── .python-version # Python 3.12+
Fix browser-use CDP frame crash — bug connu (#2808) : quand une iframe pub ou cookies est détruite pendant la navigation, asyncio.gather crashe tout le DOM. DOMAutopsy patche DomService._get_ax_tree_for_all_frames au runtime avec retry + fallback arbre vide.
- Support multi-LLM : Anthropic Claude, Mistral, Ollama local
- Export Playwright TypeScript et Cypress
- Mode headless pour CI/CD
- Intégration dans QA OPS LAB comme module Test Generation
| Outil | Fonction |
|---|---|
| LogLens | Monitoring de logs temps réel |
| DiffLens | Diff visuel sémantique 5 couches |
| DOMAutopsy | Harvester de locators IA + génération code test |
| QA OPS LAB | SaaS Test Management complet |
Même ADN : Python, zéro dépendance inutile, python main.py, thème dark.
JMer Consulting — QA OPS LAB — 2026