Die Sitzung überdauert keine zwei Aufrufe
Sie melden sich an, die Antwort zeigt, dass es geklappt hat, und der nächste Aufruf landet auf der Anmeldeseite, oder meldet Erfolg und tut nichts. Was passiert, und die Regel, die das vermeidet.
Das Symptom. Sie teilen eine Aufgabe auf zwei Aufrufe auf. Der erste
meldet sich an und speichert die Sitzung, der zweite verwendet sie weiter.
Entweder landet der zweite Aufruf auf der Anmeldeseite, oder, schlimmer, er
liefert schnell succes: true und ändert nichts am Ziel.
Was passiert
Eine gespeicherte Sitzung ist ein storage_state von Playwright: Cookies
und lokaler Speicher, sonst nichts. Zwei Dinge fehlen darin, und genau diese
beiden lassen die Aufgabe scheitern.
Der Zustand der Seite. Ein gesetztes Häkchen, eine gewählte Option, ein offener Dialog: Beim Fortsetzen ist alles weg. Die Seite kommt leer zurück, Ihr Szenario läuft darauf, klickt auf das, was der Selektor jetzt findet, und meldet Erfolg. Aus Sicht von Dinoer scheitert nichts: Der Selektor hat etwas gefunden.
Die Sitzung auf dem Server. Viele Anwendungen vergeben direkt nach der Anmeldung eine neue Sitzungskennung. Stammt das gespeicherte Cookie von vor diesem Wechsel, ist es im Browser gültig und auf dem Server nutzlos.
Die Regel
Teilen Sie nie eine Aufgabe auf, die vom Zustand der Seite abhängt. Anmelden, handeln und prüfen in einem Aufruf, auch wenn das eine neue Anmeldung bedeutet.
Ein Aufruf nimmt eine Liste von Aktionen; genau dafür ist die Liste da:
{"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"},
{"type": "cliquer", "selecteur": "#next-step"}
]}
Ein Browserstart, eine Antwort. Auf mehrere Aufrufe verteilt, startet dieselbe Aufgabe jedes Mal den Browser, lädt die Sitzung neu und verliert dazwischen den Zustand der Seite.
Wann das Speichern der Sitzung das richtige Werkzeug ist
Eine Sitzung zu speichern hat einen einzigen, engen Zweck: mehrere Seiten mit Anmeldung lesen, die nicht voneinander abhängen. Ein Dashboard, dann eine Einstellungsseite, dann ein Bericht, jede für sich vollständig.
# Einmal anmelden
/opt/dinoer/venv/bin/python3 /opt/dinoer/shot.py \
--url https://target.local/login --guide-version 1.6 \
--actions login.json --sauver-session ~/session.json
# Beliebig viele unabhängige Seiten lesen
/opt/dinoer/venv/bin/python3 /opt/dinoer/shot.py \
--url https://target.local/dashboard --guide-version 1.6 \
--reprendre-session ~/session.json
Die Sitzung trägt, wer Sie sind, nicht, was Sie gerade taten.
Die Antwort lesen, nicht nur das Urteil
Nach --reprendre-session sagt Ihnen die Antwort, wo Sie stehen:
"boussole": {
"url_courante": "https://target.local/login",
"dernier_code_http": 200,
"session_derive": {"url_sauvegardee": "https://target.local/dashboard",
"url_reprise": "https://target.local/login",
"avertissement": "…"}
}
session_derive erscheint, wenn die Seite, auf der Sie gelandet sind, nicht
die ist, auf der die Sitzung gespeichert wurde: Was diese Seite enthielt, ist
verloren. Es erscheint auch, wenn Sie absichtlich auf einer anderen Seite
fortsetzen; vergleichen Sie daher url_courante mit der angefragten Adresse.
Sind Sie auf der Anmeldeseite gelandet, trägt die Sitzung nicht mehr: Melden
Sie sich neu an, ohne --reprendre-session. --auth-indicator mit einem
Selektor, der nur nach der Anmeldung existiert, beantwortet die Frage direkt
in auth_status.
Lesen Sie dann dernier_code_http. Eine abgelaufene Sitzung und ein
Anwendungsfehler können beide auf der Anmeldeseite enden. Ein 200 oder
302 deutet auf einen Ablauf hin: Melden Sie sich neu an. Ein 500 oder ein
4xx heißt, dass die Anwendung versagt hat und die Sitzung nie das Problem
war; eine neue Anmeldung hilft nicht.
Bei einem Lauf mit mehreren naviguer-Aktionen spiegelt dieses Feld nur die
letzte Navigation wider, die nicht unbedingt die ist, die das Problem
erklärt.
Kurz gesagt
- Eine Aufgabe, die vom Seitenzustand abhängt: ein Aufruf, eine Liste von Aktionen.
- Unabhängige Seiten mit Anmeldung lesen: Sitzung speichern ist in Ordnung.
- Nach einem Fortsetzen:
url_courantemit der angefragten Seite vergleichen, danndernier_code_httplesen. - Ein schnelles
succes: truebei einer Aufgabe, die Sie für langsam hielten, ist eine Warnung, kein Ergebnis.