playwright-network-chaos-mcp

Caos dinámico de red en Playwright: errores 503, latencia, caídas en pleno vuelo

Documentación

playwright-network-chaos-mcp 🐸💥

npm version npm downloads CI License: MIT

Un servidor MCP que brinda a los agentes de IA control dinámico de caos de red sobre sesiones de navegador Playwright.

Tus pruebas se ejecutan en redes perfectas. Tus usuarios no. Este MCP permite a los agentes de IA simular caídas de API, inyectar latencia, interrumpir conexiones a mitad de vuelo y bloquear recursos de terceros — y luego verificar si la aplicación maneja la situación con elegancia.


🤔 El Problema

Los entornos de CI tienen conectividad impecable. Las APIs responden en milisegundos. Los CDN nunca se caen. Entonces tus pruebas pasan — y luego la producción se rompe cuando el servicio de pagos devuelve un 503, la red se cae a mitad del proceso de pago, o Google Analytics se cuelga durante 8 segundos y congela la página.

Los agentes de IA que escriben pruebas de Playwright no tienen forma de introducir o razonar sobre inestabilidad de red. No pueden preguntar:

  • 🙈 ¿Muestra la página de pago un estado de error cuando la API de pagos falla?
  • 🙈 ¿Aparece el cargador esqueleto mientras la API del panel es lenta?
  • 🙈 ¿Sigue funcionando la aplicación si se bloquean todos los scripts de seguimiento?
  • 🙈 ¿Qué sucede si la red se cae después de enviar el pedido pero antes de que llegue la respuesta?

playwright-network-chaos-mcp soluciona eso.


🛠️ Herramientas

simulate_api_failure

Intercepta solicitudes que coinciden con un patrón y las fuerza a devolver un código de estado de error. Verifica si la aplicación muestra una interfaz de respaldo.

{
  "url": "https://your-app.com/checkout",
  "intercept_pattern": "**/api/payment**",
  "status_code": 503,
  "fallback_selector": ".error-boundary",
  "wait_ms": 2000
}
{
  "intercepted_count": 2,
  "fallback_found": true,
  "fallback_selector": ".error-boundary",
  "page_state": {
    "page_errors": [],
    "console_errors": ["Failed to load resource: 503"]
  }
}

inject_latency

Añade retraso artificial a las solicitudes coincidentes. Verifica si aparecen estados de carga mientras la aplicación espera.

{
  "url": "https://your-app.com/dashboard",
  "intercept_pattern": "**/api/**",
  "latency_ms": 3000,
  "jitter_ms": 500,
  "loading_selector": ".skeleton-loader"
}
{
  "intercepted_count": 4,
  "intercepted_requests": [
    { "url": "https://api.your-app.com/users", "method": "GET", "delay_ms": 3241 }
  ],
  "loading_state_found": true,
  "load_time_ms": 3890
}

block_resources

Aborta solicitudes a patrones de URL específicos — para probar caídas de terceros (analítica, CDN, píxeles de seguimiento).

{
  "url": "https://your-app.com",
  "block_patterns": ["**/analytics**", "*.doubleclick.net/**", "**/hotjar**"],
  "core_content_selector": ".main-content",
  "wait_ms": 2000
}
{
  "blocked_count": 7,
  "blocked_urls": ["https://www.google-analytics.com/analytics.js", "..."],
  "core_content_found": true,
  "page_state": { "page_errors": [], "console_errors": [] }
}

simulate_network_drop

Aborta solicitudes a mitad de vuelo después de un retraso — simulando pérdida de conexión entre solicitud y respuesta.

{
  "url": "https://your-app.com/checkout",
  "intercept_pattern": "**/api/order**",
  "drop_after_ms": 800,
  "fallback_selector": ".network-error-toast",
  "wait_ms": 3000
}
{
  "intercepted_count": 1,
  "fallback_found": true,
  "fallback_selector": ".network-error-toast",
  "page_state": { "page_errors": ["TypeError: Failed to fetch"] }
}

trigger_system_network_error

Aborta solicitudes con un código de error a nivel de sistema operativo — simulando fallos de DNS, bloqueos de firewall y reinicios de conexión.

{
  "url": "https://your-app.com/dashboard",
  "intercept_pattern": "**/api/**",
  "error_code": "addressunreachable",
  "fallback_selector": ".network-error"
}
{
  "error_code": "addressunreachable",
  "intercepted_count": 3,
  "fallback_found": true,
  "page_state": { "page_errors": [], "console_errors": ["net::ERR_ADDRESS_UNREACHABLE"] }
}

simulate_stateful_failure

Falla las primeras N solicitudes y luego permite que las siguientes tengan éxito — probando lógica de reintentos y flujos de recuperación.

{
  "url": "https://your-app.com/dashboard",
  "intercept_pattern": "**/api/data**",
  "http_status": 503,
  "failure_count": 2,
  "success_payload": "{\"data\":[]}",
  "fallback_selector": ".retry-button"
}
{
  "failure_count": 2,
  "actual_failed": 2,
  "actual_succeeded": 1,
  "intercepted_requests": [
    { "url": "...", "method": "GET", "status": 503, "attempt": 1, "outcome": "failed" },
    { "url": "...", "method": "GET", "status": 200, "attempt": 3, "outcome": "passed" }
  ],
  "fallback_found": true
}

inject_response_corruption

Sirve respuestas malformadas a nivel de protocolo — JSON sin terminar, mentiras de content-length o cargas truncadas.

{
  "url": "https://your-app.com/checkout",
  "intercept_pattern": "**/api/order**",
  "corruption_type": "malformed_json",
  "fallback_selector": ".parse-error"
}
{
  "corruption_type": "malformed_json",
  "intercepted_count": 1,
  "fallback_found": false,
  "page_state": { "page_errors": ["SyntaxError: Unexpected token u in JSON"] }
}

assert_chaos_handled

Inyecta un estado HTTP de caos y devuelve un veredicto estructurado de aprobado/fallido — chaos_survived es verdadero solo cuando aparece la interfaz de respaldo y no hay excepciones de JavaScript no manejadas.

{
  "url": "https://your-app.com/checkout",
  "intercept_pattern": "**/api/**",
  "http_status": 500,
  "expected_fallback_selector": ".error-boundary"
}
{
  "http_status": 500,
  "unhandled_exceptions": [],
  "console_errors": ["Failed to load resource: 500"],
  "fallback_ui_detected": true,
  "chaos_survived": true
}

🚀 Instalación

npx playwright-network-chaos-mcp

O instala globalmente:

npm install -g playwright-network-chaos-mcp
npx playwright install chromium

Configuración de Claude Desktop

{
  "mcpServers": {
    "playwright-network-chaos-mcp": {
      "command": "npx",
      "args": ["-y", "playwright-network-chaos-mcp"]
    }
  }
}

💡 Ejemplos de Prompts para Agentes

"Verifica si la página de pago muestra un estado de error adecuado cuando la API de pagos devuelve 503"

"Simula un retraso de API de 3 segundos en el panel y verifica que aparezca el cargador esqueleto"

"Bloquea toda la analítica y los scripts de seguimiento y confirma que el contenido principal aún se carga"

"Interrumpe la solicitud de envío del pedido a mitad de vuelo y verifica si el usuario ve un mensaje de error"

"Simula un fallo de DNS para la API y verifica si se renderiza el límite de error"

"Falla las primeras 3 solicitudes y luego deja que tengan éxito — ¿la aplicación reintenta y se recupera automáticamente?"

"Inyecta JSON malformado y verifica que la aplicación no se bloquee — devuelve un veredicto de caos"


🔗 Proyectos Relacionados


📄 Licencia

MIT © vola-trebla