Diwall

Français
Télécharger 1.24.4

Ç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.