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 🐸💥
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
- playwright-trace-decoder-mcp — análise de causa raiz de falhas de CI a partir de traces do Playwright
- flakiness-knowledge-graph-mcp — grafo de conhecimento de padrões de testes instáveis
- ast-impact-mapper-mcp — encontre testes afetados por mudanças de código via AST do TypeScript
- zod-contract-mock-forge-mcp — geração determinística de mocks a partir de esquemas Zod
- playwright-spatial-layout-mcp — consciência espacial geométrica de layouts web
📄 Licença
MIT © vola-trebla