Escenarios en lenguaje natural
Describe la prueba en lenguaje natural. Sin selectores, sin page objects, sin código de prueba que mantener.
El LLM planifica las acciones del navegador una vez. A partir de la segunda ejecución, Windup hace un replay determinista con cero llamadas al LLM — ~1 segundo, $0, resultados estables. Editas escenarios, no selectores.
$ npm i -D windupjs
El problema
Las pruebas E2E escritas a mano se rompen cada vez que se mueve un selector. Los agentes de IA que manejan el navegador en cada ejecución son lentos, no deterministas y te cobran una llamada al LLM por prueba.
Windup planifica una vez y guarda en caché un plan de acciones validado. Los replays son deterministas y gratuitos. Cuando la app cambia y una verificación falla, el plan se invalida y se replanifica automáticamente — se autorepara, no queda silenciosamente incorrecto.
Cómo funciona
La parte cara — averiguar las acciones del navegador — ocurre una sola vez y se convierte en datos verificables guardados en caché.
Una tarea en lenguaje natural va al planificador. El LLM emite un plan de acciones JSON — una llamada, solo en la primera ejecución.
Un ejecutor determinista (Playwright) ejecuta el plan. Postcondiciones baratas de DOM/URL verifican cada acción — sin LLM.
La trayectoria queda en caché. Cada ejecución posterior la reproduce: cero llamadas al LLM, ~1 segundo, $0, el mismo plan siempre.
Por qué Windup
Los scripts escritos a mano son baratos de ejecutar pero caros de mantener. Los agentes de IA por ejecución son fáciles de escribir pero lentos y no deterministas. Windup toma la mitad buena de cada uno.
| Dimensión | Scripts escritos a mano | Agente de IA en cada ejecución | Windup |
|---|---|---|---|
| Autoría | Código + selectores | Lenguaje natural | Lenguaje natural |
| Coste por ejecución | $0 | LLM en cada ejecución | LLM solo en la 1ª ejecución |
| Velocidad | Rápido | Lento (modelo en el bucle) | ~1s replay |
| Determinismo | Alto | Bajo (improvisa) | Alto (el mismo plan siempre) |
| La app cambió | Arreglas el script | Puede hacer algo incorrecto en silencio | La verificación falla → replanifica |
Características
Una CLI hecha para proyectos reales: autoría, secretos, dependencias, seguimiento de costes y reporters de CI.
Describe la prueba en lenguaje natural. Sin selectores, sin page objects, sin código de prueba que mantener.
A partir de la 2ª ejecución: llm_calls=0, ~1s, $0. El plan en caché se ejecuta igual siempre.
Playwright con eventos de entrada confiables (isTrusted) — clics, escritura y navegación fiables.
Postcondiciones de DOM/URL comprobadas en cada acción, sin LLM en el bucle.
Autoría asistida por LLM: escribe el escenario a partir de las pantallas reales de tu app (mapa del sitio) + el manifiesto del proyecto. --validate lo ejecuta y refina hasta que pasa.
Indexa tus rutas y elementos directamente desde el código fuente (Next.js, react-router).
Las credenciales nunca entran en el escenario, la caché, el prompt del LLM ni git — solo referencias ENV:*, resueltas en tiempo de ejecución.
Dependencias entre escenarios (p. ej. "crear factura" depende de "login") — misma sesión, con caché por dependencia.
La IA escribe un informe posterior a la ejecución citando valores reales observados — precios, mensajes, confirmaciones.
Ante un fallo, la IA lee la página real y sugiere la corrección para tu escenario.
JUnit, JSON y HTML autocontenido (--reporter). Código de salida distinto de cero ante cualquier fallo.
Google Gemini y OpenAI, elegidos por ejecución (--llm openai:gpt-5-mini). windup costs rastrea el gasto por proveedor y modelo.
Ejecuta escenarios en paralelo sobre un único navegador caliente compartido con contextos aislados — ~2× más rápido en una suite mixta, más con planificación o flujos largos. Secuencial por defecto.
Ejecuta los mismos escenarios en Chromium (por defecto), Firefox o WebKit con --browser. Un único plan se reproduce en los tres — escribe una vez, ejecuta en todos.
Ejemplo
Tú escribes la intención. La primera ejecución planifica y paga unas décimas de céntimo; cada ejecución posterior es un replay desde caché a $0.
{
"scenario_id": "checkout",
"task": "Log in as the qa account, add 'Backpack' to the cart, check out and verify the order confirmation message appears."
} $ windup run checkout # 1st run
PASS checkout cache=miss llm_calls=1 total=3003ms cost=$0.0024
$ windup run checkout # again — deterministic replay
PASS checkout cache=hit llm_calls=0 total=671ms cost=$0 cache=hit · llm_calls=0 · $0 — la segunda ejecución nunca toca el modelo.
CI / CD
Ejecuta toda la suite en un navegador caliente, haz fallar el build ante cualquier escenario fallido y emite informes legibles por máquina o por humanos.
$ npx windup run --all --reporter junit \
--report-file reports/windup.xml Fiabilidad
Los replays se miden, no se prometen. El plan en caché produce el mismo resultado en cada ejecución — sin modelo, sin flakes.
Empezar
Node ≥ 20 y una clave de API — GOOGLE_GENERATIVE_AI_API_KEY (Google, por defecto) o OPENAI_API_KEY (OpenAI) — en .env.local. Las claves se usan solo para planificar; los replays en caché nunca llaman a un LLM.
$ npm i -D windupjs $ npx windup init $ npx windup scan $ npx windup new "log in and create an invoice for ACME" $ npx windup run checkout Para la era de la IA
Ya nadie lee la documentación — se la pasa a un asistente. Por eso Windup incluye un llms.txt: toda la documentación, estructurada para máquinas. Apunta tu agente de código hacia él, describe los flujos con palabras y él escribe y ejecuta los escenarios por ti.
Pega esta URL en tu asistente (Claude, Cursor, Copilot, …).
https://windup.run/es/llms.txt Un prompt inicial listo para pegar — completa tus flujos.
Lee https://windup.run/es/llms.txt y configura pruebas E2E de Windup para mi app, luego escribe escenarios para estos flujos: ... llms-full.txt — toda la documentación en un solo archivo · markdown por página en /es/docs/<page>.md · el estándar llms.txt