Ça a cliqué, mais pas sur l’élément voulu
Trois boutons identiques, une liste qui a gagné quatre lignes, un bandeau fermé entre la capture et le clic. Le numéro était juste, la cible était fausse.
Le symptôme. Le clic marche. Il se passe quelque chose. Ce n’est pas ce que vous vouliez — le mauvais domaine a été cloné, la mauvaise ligne supprimée, la mauvaise boîte de dialogue ouverte.
Aucune erreur, parce que rien n’a mal tourné mécaniquement. Diwall a cliqué sur ce que vous avez désigné. Vous avez désigné la mauvaise chose.
Cause 1 — plusieurs éléments répondent à votre sélecteur
Une page avec trois boutons « Clone », un par domaine. Ce sélecteur prend le premier dans l’ordre du DOM :
{"type": "cliquer", "selecteur": "button:has-text('Clone')"}
Constaté pour de vrai : le clonage est parti sur un autre domaine que celui visé, et seul le journal du serveur l’a dit. Une inversion silencieuse.
Le remède — désigner, pas décrire. Soit vous précisez le sélecteur avec quelque chose de propre à cette ligne :
{"type": "cliquer", "selecteur": "button[title='Clone example-two']"}
Soit vous prenez le numéro Set-of-Mark, unique par construction : trois boutons identiques reçoivent trois numéros différents.
Cause 2 — la page a changé, donc le numéro a bougé
Set-of-Mark numérote les éléments dans l’ordre du DOM. Ajoutez quatre lignes à la liste au-dessus de votre cible, et votre cible se décale de quatre. Une procédure validée sur une page à une ligne casse sur la même page à cinq — même code, même sélecteur, autre résultat.
Pire : quelque chose peut apparaître ou disparaître entre votre capture et votre clic. Un bandeau de cookies qui se ferme, une fenêtre modale qui s’ouvre. Le numéro lu sur la capture ne désigne plus le même élément au moment où le clic s’exécute.
Le remède, en deux niveaux.
Refaites la capture Set-of-Mark après toute action qui change le DOM, et lisez les nouveaux numéros. Cela réduit la fenêtre ; cela ne la ferme pas sur une page qui ne cesse de bouger.
Pour la fermer, capturez Set-of-Mark dans le scénario lui-même, avant le
premier cliquer_som :
diwall-shot --url https://target.local/ --som --guide-version 1.3 \
--actions '[{"type":"capturer","nom":"avant","som":true},{"type":"cliquer_som","id":5}]'
Depuis la 1.24.0, la résolution par défaut est hybride. Quand un marqueur
data-dw-som-id existe — posé par un capturer avec "som": true plus tôt
dans le même scénario —, Diwall résout par ce marqueur au lieu de réindexer le
DOM en l’état : id: 5 est cet élément, quoi qu’il ait bougé autour. Sans
capture préalable dans le scénario, il revient à l’ancienne réindexation, sans
changement. Dans les deux cas, la réponse dit quelle voie a servi, dans
boussole.respect.som_resolution (stable, brut ou brut_sans_reference),
et signale tout désaccord entre les deux voies dans
boussole.respect.som_derive_detectee — la dérive n’est plus jamais
silencieuse.
Le marqueur ne survit pas d’un appel shot.py à l’autre (chacun recharge la
page) : c’est la raison profonde pour laquelle une séquence avec état tient dans
un seul scénario. --som-brut force la réindexation seule d’avant la 1.24.0 ;
--som-rafraichir est conservé comme alias sans effet.
Identifier par le contenu, pas par la position
« Le plus récent est le numéro 7 » est vrai jusqu’à ce que quelqu’un en crée un nouveau.
Quand votre cible porte un élément d’identification — un horodatage, un slug,
un identifiant dans un attribut value ou data-* —, Set-of-Mark vous le donne
déjà. elements_som[].texte l’expose, et vous pouvez filtrer le JSON
directement :
{"id": 12, "tag": "INPUT", "texte": "clone-2026-08-01-0930"}
Choisissez le numéro en comparant ce texte, pas en comptant les lignes. Aucun
modèle de vision nécessaire, aucune heuristique qui cassera la semaine
prochaine. Même idée pour contrôler après coup — un evaluer renvoie les
éléments restants en JSON, comparables par programme :
{"type": "evaluer",
"script": "Array.from(document.querySelectorAll('input.chk-item')).map(i => i.value)"}
En bref
- Un sélecteur qui répond à plusieurs éléments prend le premier, sans rien dire.
- Les numéros Set-of-Mark bougent avec le DOM — refaites la capture après chaque modification.
- Capturez Set-of-Mark dans le scénario avant d’agir ; la résolution hybride attache alors un numéro à cet élément et signale toute dérive dans
som_derive_detectee. - Identifiez les cibles par leur contenu, jamais par leur position dans une liste.