Dinoer

Escribir un guion

Un archivo JSON, una lista de acciones, dieciocho verbos: ninguno de ellos numerado. ¿Cómo crear uno que siga funcionando el mes que viene? Y los dos hábitos que determinan si lo hace.

Un escenario es un archivo JSON: indica dónde ir y qué hacer allí. Es la unidad de trabajo del núcleo del navegador que se mantiene; los crearás, los reutilizarás y los pondrás bajo control de versiones.

{
  "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"}
  ]
}

Se requieren dos campos: url y actions. Todo lo demás es opcional, y el archivo se valida contra scenarios/schema.json antes de que un navegador comience a funcionar; un error tipográfico en un nombre de campo detiene la ejecución inmediatamente, en lugar de a mitad del proceso.

Comienza observando, sin modificar.

No puede escribir acciones para una página que no ha leído. Mapee primero:

/opt/dinoer/venv/bin/python3 /opt/dinoer/shot.py \
  --url https://target.local/login --a11y --guide-version 1.6

a11y_tree le da la estructura y los selectores. Escriba el escenario a partir de esa salida, no de memoria de cómo probablemente luce la página — la propia regla del manual de reconocimiento-antes-de-mutación, no una simple sugerencia. El escenario de reconocimiento, ejecutado de verdad →

Los dieciocho verbos

FamiliaAcciones
Actuarcliquer, remplir, defiler
Dentro de un marcocliquer_iframe, remplir_iframe
Movernaviguer
Esperarattendre, attendre_absence, attendre_selecteur_present, attendre_navigation, attendre_url, attendre_reseau_calme, pause
Observarevaluer, extraire_texte
MFAattendre_mfa_ntfy
Componerdeclencher_scenario, nettoyer_overlay

Cada acción se dirige a un selector de CSS; no hay una superposición numerada para seleccionar en su lugar, intencionalmente. ¿Por qué? →

Cada verbo, con sus claves obligatorias y opcionales, y los códigos de salida, están en la hoja de referencia rápida.

Hábito uno: espera una señal, nunca un tiempo determinado

Un pause es una apuesta sobre cuánto tiempo tarda algo. Lo perderás, en ambas direcciones.

{"type": "cliquer", "selecteur": "button[type=\"submit\"]"},
{"type": "attendre_absence", "selecteur": ".spinner"},
{"type": "attendre_selecteur_present", "selecteur": ".result"}

Establece una pausa de diez segundos y una operación que toma quince, y obtendrás una respuesta mientras el trabajo aún se está ejecutando: éxito reportado, nada verificado. Una operación que tarda dos desperdicia ocho segundos en cada ejecución. Esperar una señal DOM hace que el escenario tarde exactamente tanto como el trabajo.

Hábito dos: afirma antes de actuar

Coloque una verificación al principio. Si la página no es la que espera, el escenario se detiene antes de escribir cualquier cosa en ningún lugar:

{"type": "evaluer", "script": "document.title", "contient": "Sign in"}

Esto no cuesta nada y es lo que separa una redirección que no notaste de una contraseña ingresada en un formulario de un desconocido. auth_indicator hace lo mismo a nivel de archivo: un selector que solo existe cuando se ha autenticado y se verifica automáticamente:

{"auth_indicator": ".user-menu", "url": "…", "actions": [...]}

Opciones que el archivo puede contener por sí mismo

Algunas banderas pertenecen al objetivo, no a quien ejecuta el escenario. Colóquelas en el archivo para que permanezca autocontenido:

PropiedadPara
wait_untilun objetivo que nunca entra en estado de inactividad de la red
http_credentialsautenticación HTTP básica
auth_indicatoruna verificación automática de autenticación
intentionuna frase registrada en el registro de operaciones

Quien reutilice su escenario no necesitará conocer las peculiaridades del objetivo.

Nunca escribas una credencial

{"type": "remplir", "selecteur": "input[name=\"password\"]",
 "valeur": "depuis_secrets", "secret_cle": "password"}

El escenario nombra una clave; el directorio cifrado guarda el valor. Esto es lo que hace que un escenario sea seguro para confirmar en el repositorio, y la verificación de publicación rechaza cualquier ejecución que encuentre una contraseña en texto plano en él — en un campo remplir o dentro de un script evaluer.

El directorio de credenciales encriptado →

En resumen

  • Primero, mapea la página con --a11y; escribe el escenario basándote en esa salida.
  • url y actions son obligatorios; todo lo demás es opcional.
  • Cada objetivo es un selector CSS; no hay otra forma de nombrarlo.
  • Espera señales, no duraciones.
  • Verifica la página antes de interactuar con ella.
  • Una credencial siempre es un secret_cle, nunca un valor, en ninguna parte del archivo.