playwright-network-chaos-mcp

Caos de rede dinâmico no Playwright: 503s, latência, quedas durante a execução

Documentação

playwright-network-chaos-mcp 🐸💥

npm version npm downloads CI License: MIT

Um servidor MCP que dá a agentes de IA controle dinâmico de caos de rede sobre sessões de navegador Playwright.

Seus testes rodam em redes perfeitas. Seus usuários não. Este MCP permite que agentes de IA simulem indisponibilidades de API, injetem latência, derrubem conexões no meio da requisição e bloqueiem recursos de terceiros — e então verifiquem se o aplicativo lida com isso de forma graciosa.


🤔 O Problema

Ambientes de CI têm conectividade impecável. APIs respondem em milissegundos. CDNs nunca caem. Então seus testes passam — e a produção quebra quando o serviço de pagamento retorna um 503, a rede cai no meio do checkout, ou o Google Analytics trava por 8 segundos e congela a página.

Agentes de IA escrevendo testes Playwright não têm como introduzir ou raciocinar sobre instabilidade de rede. Eles não podem perguntar:

  • 🙈 A página de checkout mostra um estado de erro quando a API de pagamento falha?
  • 🙈 O loader de esqueleto aparece enquanto a API do dashboard está lenta?
  • 🙈 O aplicativo ainda funciona se todos os scripts de rastreamento forem bloqueados?
  • 🙈 O que acontece se a rede cair depois que o pedido é enviado, mas antes que a resposta chegue?

playwright-network-chaos-mcp resolve isso.


🛠️ Ferramentas

simulate_api_failure

Intercepta requisições que correspondem a um padrão e força-as a retornar um código de status de erro. Verifica se o aplicativo mostra uma UI de fallback.

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

Adiciona atraso artificial a requisições correspondentes. Verifica se estados de carregamento aparecem enquanto o aplicativo 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 requisições para padrões de URL especificados — para testar indisponibilidades de terceiros (analytics, CDNs, pixels de rastreamento).

{
  "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 requisições no meio do voo após um atraso — simulando perda de conexão entre requisição e resposta.

{
  "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 requisições com um código de erro de nível de sistema operacional — simulando falhas de DNS, bloqueios de firewall e redefinições de conexão.

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

Falha as primeiras N requisições e depois permite que as subsequentes tenham sucesso — testando lógica de repetição e fluxos de recuperação.

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

Entrega respostas malformadas no nível de protocolo — JSON não terminado, mentiras de content-length ou payloads truncados.

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

Injeta um status HTTP de caos e retorna um veredito estruturado de passou/falhou — chaos_survived é verdadeiro apenas quando a UI de fallback aparece e não há exceções JS não tratadas.

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

🚀 Instalação

npx playwright-network-chaos-mcp

Ou instale globalmente:

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

Configuração do Claude Desktop

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

💡 Exemplos de Prompts para Agentes

"Verifique se a página de checkout mostra um estado de erro adequado quando a API de pagamento retorna 503"

"Simule um atraso de API de 3 segundos no dashboard e verifique se o loader de esqueleto aparece"

"Bloqueie todos os scripts de analytics e rastreamento e confirme que o conteúdo principal ainda carrega"

"Derrube a requisição de envio do pedido no meio do voo e verifique se o usuário vê uma mensagem de erro"

"Simule falha de DNS para a API e verifique se o limite de erro renderiza"

"Falhe as primeiras 3 requisições e depois tenha sucesso — o aplicativo tenta novamente e se recupera automaticamente?"

"Injete JSON malformado e verifique se o aplicativo não trava — retorne um veredito de caos"


🔗 Projetos Relacionados


📄 Licença

MIT © vola-trebla