Diwall

Deutsch
Herunterladen 1.24.4

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.