Dinoer

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_courante con la página pedida y lea después dernier_code_http.
  • Un succes: true rápido en una tarea que creía lenta es un aviso, no un resultado.