Ein Szenario schreiben
Eine JSON-Datei, eine Liste von Aktionen, achtzehn Verben – keines davon ist nummeriert. Wie erstellt man eine, die nächsten Monat noch funktioniert, und welche zwei Gewohnheiten entscheiden darüber?
Ein Szenario ist eine JSON-Datei: sie beschreibt, wohin man geht und was man dort tut. Es ist die Arbeitseinheit des Browser-Kernmoduls – Sie werden sie schreiben, wiederverwenden und unter Versionskontrolle stellen.
{
"nom": "check-dashboard",
"url": "https://target.local/login",
"actions": [
{"type": "remplir", "selecteur": "input[name=\"username\"]", "valeur": "depuis_secrets", "secret_cle": "username"},
{"type": "remplir", "selecteur": "input[name=\"password\"]", "valeur": "depuis_secrets", "secret_cle": "password"},
{"type": "cliquer", "selecteur": "button[type=\"submit\"]"},
{"type": "attendre_selecteur_present", "selecteur": ".user-menu"}
]
}
Zwei Felder sind erforderlich: url und actions. Alles andere ist optional,
und die Datei wird vor dem Start eines Browsers anhand von scenarios/schema.json validiert. Ein Tippfehler im Namen einer Schlüsselvariable stoppt den Vorgang sofort, anstatt erst in der Mitte.
Beginnen Sie damit, zu betrachten, ohne etwas zu verändern
Sie können keine Aktionen für eine Seite definieren, die Sie noch nicht gelesen haben. Erstellen Sie zuerst ein Verzeichnis:
/opt/dinoer/venv/bin/python3 /opt/dinoer/shot.py \
--url https://target.local/login --a11y --guide-version 1.6
a11y_tree liefert Ihnen die Struktur und die Selektoren. Schreiben Sie das Szenario aus dieser Ausgabe, nicht aus der Erinnerung daran, wie die Seite wahrscheinlich aussieht – die eigene Regel des Leitfadens „Aufklärung vor Mutation“, keine bloße Empfehlung.
The reconnaissance scenario, run for real →
Die achtzehn Verben
| Familie | Aktionen |
|---|---|
| Aktion | cliquer, remplir, defiler |
| Innerhalb eines Rahmens | cliquer_iframe, remplir_iframe |
| Bewegen | naviguer |
| Warten | attendre, attendre_absence, attendre_selecteur_present, attendre_navigation, attendre_url, attendre_reseau_calme, pause |
| Beobachten | evaluer, extraire_texte |
| MFA | attendre_mfa_ntfy |
| Komponieren | declencher_scenario, nettoyer_overlay |
Jede Aktion zielt auf einen CSS-Selektor ab – es gibt keine nummerierten Elemente, die stattdessen angeklickt werden könnten, und das ist Absicht. Warum →
Jedes Verb mit seinen Pflicht- und optionalen Schlüsseln sowie die Exit-Codes stehen im Spickzettel.
Gewohnheit eins – auf ein Signal warten, niemals auf eine Zeitdauer
Ein
pauseist eine Wette darauf, wie lange etwas dauert. Sie werden sie verlieren, in beide Richtungen.
{"type": "cliquer", "selecteur": "button[type=\"submit\"]"},
{"type": "attendre_absence", "selecteur": ".spinner"},
{"type": "attendre_selecteur_present", "selecteur": ".result"}
Setzen Sie eine Pause auf zehn Sekunden und ein Vorgang, der fünfzehn Einheiten benötigt, gibt Ihnen eine Antwort, während der Job noch läuft – Erfolg gemeldet, nichts verifiziert. Ein Vorgang, der zwei Einheiten benötigt, verschwendet acht Sekunden bei jeder einzelnen Ausführung. Das Warten auf ein DOM-Signal lässt das Szenario genau so lange dauern wie die eigentliche Arbeit.
Gewohnheit zwei – erst prüfen, dann handeln
Setzen Sie eine Prüfung an den Anfang. Ist die Seite nicht die erwartete, hält das Szenario an, bevor irgendwo etwas eingegeben wird:
{"type": "evaluer", "script": "document.title", "contient": "Sign in"}
Das kostet nichts und es ist das, was zwischen einer Weiterleitung steht, die Sie nicht bemerkt haben, und einem Passwort, das in ein Formular eines Fremden eingegeben wird. auth_indicator macht dasselbe auf Dateiebene – ein Selektor, der nur existiert, wenn eine Authentifizierung vorliegt und automatisch geprüft wird:
{"auth_indicator": ".user-menu", "url": "…", "actions": [...]}
Optionen, die die Datei selbst tragen kann:
Einige Flags gehören zum Ziel, nicht zu demjenigen, der das Szenario ausführt. Legen Sie sie in die Datei, damit diese eigenständig bleibt:
| Eigenschaft | Für |
|---|---|
wait_until | ein Ziel, das niemals in den Netzwerk-Leerlauf geht |
http_credentials | HTTP Basic Authentifizierung |
auth_indicator | eine automatische Authentifizierungsprüfung |
intention | ein Satz, der im Betriebsprotokoll aufgezeichnet wurde |
Wer Ihr Szenario wiederverwendet, muss die Eigenheiten des Ziels nicht kennen.
Schreiben Sie niemals Anmeldedaten direkt in den Code
{"type": "remplir", "selecteur": "input[name=\"password\"]",
"valeur": "depuis_secrets", "secret_cle": "password"}
Das Szenario nennt einen Schlüssel; das verschlüsselte Verzeichnis enthält den Wert. Deshalb lässt sich ein Szenario gefahrlos committen, und die Veröffentlichungsprüfung weist jeden Lauf zurück, der darin ein Passwort im Klartext findet – in einem remplir-Feld oder in einem evaluer-Skript.
Kurz gesagt
- Erfassen Sie die Seite zuerst mit
--a11y; schreiben Sie das Szenario auf Grundlage dieser Ausgabe. urlundactionssind erforderlich – alles andere ist optional.- Jedes Ziel ist ein CSS-Selektor – es gibt keine andere Möglichkeit, eines zu benennen.
- Warten Sie auf Signale, nicht auf Zeitspannen.
- Prüfen Sie die Seite, bevor Sie darauf handeln.
- Anmeldedaten sind immer ein
secret_cle, niemals ein Wert – an keiner Stelle der Datei.