Es hat geklickt, aber nicht auf das gemeinte Element
Drei gleiche Schaltflächen, eine Liste, die um vier Zeilen gewachsen ist, ein Banner, das sich zwischen Aufnahme und Klick geschlossen hat. Die Nummer stimmte, das Ziel war falsch.
Das Symptom. Der Klick funktioniert. Etwas passiert. Es ist nicht das, was Sie wollten – die falsche Domain wurde geklont, die falsche Zeile gelöscht, der falsche Dialog geöffnet.
Kein Fehler, weil mechanisch nichts schiefging. Diwall hat angeklickt, was Sie bezeichnet haben. Sie haben das Falsche bezeichnet.
Ursache 1 – mehrere Elemente passen auf Ihren Selektor
Eine Seite mit drei „Clone“-Schaltflächen, eine pro Domain. Dieser Selektor nimmt die erste in DOM-Reihenfolge:
{"type": "cliquer", "selecteur": "button:has-text('Clone')"}
Tatsächlich beobachtet: Der Klon startete auf einer anderen Domain als der beabsichtigten, und nur das Serverprotokoll verriet es. Eine stille Vertauschung.
Die Lösung – bezeichnen, nicht beschreiben. Entweder Sie ergänzen den Selektor um etwas, das nur diese Zeile hat:
{"type": "cliquer", "selecteur": "button[title='Clone example-two']"}
Oder Sie nehmen die Set-of-Mark-Nummer, die konstruktionsbedingt eindeutig ist: Drei gleiche Schaltflächen erhalten drei verschiedene Nummern.
Ursache 2 – die Seite hat sich geändert, also hat sich die Nummer verschoben
Set-of-Mark nummeriert Elemente in DOM-Reihenfolge. Fügen Sie der Liste über Ihrem Ziel vier Zeilen hinzu, und Ihr Ziel rückt um vier weiter. Ein Ablauf, der auf einer Seite mit einer Zeile geprüft wurde, bricht auf derselben Seite mit fünf – gleicher Code, gleicher Selektor, anderes Ergebnis.
Schlimmer: Etwas kann zwischen Ihrer Aufnahme und Ihrem Klick erscheinen oder verschwinden. Ein Cookie-Banner, das sich schließt, ein modales Fenster, das sich öffnet. Die Nummer, die Sie auf der Aufnahme gelesen haben, bezeichnet beim Klick nicht mehr dasselbe Element.
Die Lösung, in zwei Stufen.
Nehmen Sie Set-of-Mark nach jeder Aktion, die den DOM ändert, neu auf, und lesen Sie die neuen Nummern. Das verkleinert das Zeitfenster; auf einer Seite, die sich ständig verändert, schließt es es nicht.
Um es zu schließen, nehmen Sie Set-of-Mark im Szenario selbst auf, vor dem
ersten 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}]'
Seit 1.24.0 ist die Standardauflösung hybrid. Wenn eine Markierung
data-dw-som-id existiert – gesetzt von einem capturer mit "som": true
weiter vorne im selben Szenario –, löst Diwall über diese Markierung auf, statt
den aktuellen DOM neu zu indizieren: id: 5 ist dieses Element, was sich
auch drumherum bewegt hat. Ohne vorherige Aufnahme im Szenario fällt es
unverändert auf die alte Neuindizierung zurück. In beiden Fällen sagt die
Antwort in boussole.respect.som_resolution (stable, brut oder
brut_sans_reference), welcher Weg lief, und meldet jede Abweichung zwischen
beiden Wegen in boussole.respect.som_derive_detectee – die Verschiebung ist
nie wieder still.
Die Markierung überlebt nicht über zwei shot.py-Aufrufe hinweg (jeder lädt die
Seite neu) – der tiefere Grund, warum eine zustandsbehaftete Abfolge in ein
einziges Szenario gehört. --som-brut erzwingt die reine Neuindizierung von vor
1.24.0; --som-rafraichir bleibt als wirkungsloser Alias erhalten.
Über den Inhalt identifizieren, nicht über die Position
„Das neueste ist Nummer 7“ stimmt, bis jemand ein neues anlegt.
Trägt Ihr Ziel etwas Kennzeichnendes – einen Zeitstempel, einen Slug, eine
Kennung in einem value- oder data-*-Attribut –, liefert Set-of-Mark es Ihnen
bereits. elements_som[].texte enthält es, und Sie können das JSON direkt
filtern:
{"id": 12, "tag": "INPUT", "texte": "clone-2026-08-01-0930"}
Wählen Sie die Nummer über diesen Text, nicht durch Zeilenzählen. Kein
Vision-Modell nötig, keine Heuristik, die nächste Woche bricht. Dasselbe gilt
für die Kontrolle hinterher – ein evaluer liefert die verbliebenen Einträge
als JSON, maschinell vergleichbar:
{"type": "evaluer",
"script": "Array.from(document.querySelectorAll('input.chk-item')).map(i => i.value)"}
Kurz gesagt
- Ein Selektor, der auf mehrere Elemente passt, nimmt still das erste.
- Set-of-Mark-Nummern verschieben sich mit dem DOM – nach jeder Änderung neu aufnehmen.
- Set-of-Mark vor dem Handeln im Szenario aufnehmen; die hybride Auflösung bindet dann eine Nummer an dieses Element und meldet jede Abweichung in
som_derive_detectee. - Ziele über ihren Inhalt identifizieren, nie über ihre Position in einer Liste.