La sesión no sobrevive entre dos llamadas
Inicia sesión, la respuesta muestra que funcionó, y la llamada siguiente cae en la página de inicio de sesión, o informa de éxito y no hace nada. Qué ocurre, y la regla que lo evita.
El síntoma. Divide una tarea en dos llamadas. La primera inicia sesión y
la guarda; la segunda la reutiliza. O bien la segunda llamada cae en la página
de inicio de sesión o, peor, devuelve enseguida succes: true sin cambiar
nada en el objetivo.
Qué ocurre
Una sesión guardada es un storage_state de Playwright: las cookies y el
almacenamiento local, nada más. Faltan dos cosas, y son las dos que hacen
fallar la tarea.
El estado de la página. Una casilla marcada, una opción elegida, un diálogo abierto: todo desaparece al reanudar. La página vuelve limpia, su escenario se ejecuta sobre ella, hace clic en lo que ahora encuentra el selector e informa de éxito. Desde el punto de vista de Dinoer, nada falla: el selector encontró algo.
La sesión en el servidor. Muchas aplicaciones asignan un nuevo identificador de sesión justo después del inicio de sesión. Si la cookie guardada es anterior a ese cambio, es válida en el navegador e inútil en el servidor.
La regla
No divida nunca una tarea que dependa del estado de la página. Iniciar sesión, actuar y comprobar en una sola llamada, aunque haya que volver a iniciar sesión.
Una llamada admite una lista de acciones; para eso sirve la lista:
{"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"}
]}
Un arranque del navegador, una respuesta. Dividida en varias llamadas, la misma tarea arranca el navegador y recarga la sesión cada vez, y pierde entre medias el estado de la página.
Cuándo guardar la sesión es la herramienta adecuada
Guardar una sesión tiene un solo uso, acotado: leer varias páginas con sesión iniciada que no dependen unas de otras. Un panel, luego una página de ajustes, luego un informe, cada uno completo por sí mismo.
# Iniciar sesión una vez
/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
# Leer tantas páginas independientes como haga falta
/opt/dinoer/venv/bin/python3 /opt/dinoer/shot.py \
--url https://target.local/dashboard --guide-version 1.6 \
--reprendre-session ~/session.json
La sesión lleva quién es usted, no lo que estaba haciendo.
Lea la respuesta, no solo el veredicto
Tras --reprendre-session, la respuesta le indica dónde está:
"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 aparece cuando la página a la que llegó no es aquella en la
que se guardó la sesión: lo que contenía esa página se ha perdido. También
aparece cuando reanuda a propósito en otra página, así que compare
url_courante con la dirección que pidió. Si llegó a la página de inicio de
sesión, la sesión ya no vale: vuelva a iniciarla, sin --reprendre-session.
--auth-indicator, con un selector que solo existe con la sesión iniciada,
responde directamente en auth_status.
Lea después dernier_code_http. Una sesión caducada y un error de la
aplicación pueden acabar ambos en la página de inicio de sesión. Un 200 o un
302 apuntan a una caducidad: vuelva a iniciar sesión. Un 500 o un 4xx
significan que la aplicación falló y que la sesión nunca fue el problema;
volver a iniciar sesión no servirá de nada.
En una ejecución con varias acciones naviguer, este campo refleja solo la
última navegación, que no es necesariamente la que explica el problema.
En resumen
- Una tarea que depende del estado de la página: una llamada, una lista de acciones.
- Leer páginas independientes con sesión iniciada: guardar la sesión está bien.
- Tras reanudar: compare
url_courantecon la página pedida y lea despuésdernier_code_http. - Un
succes: truerápido en una tarea que creía lenta es un aviso, no un resultado.