mcpField
P
playwright-network-chaos-mcp

playwright-network-chaos-mcp

本地服务
github.com/vola-trebla开发工具123 周前更新

关于 playwright-network-chaos-mcp

playwright-network-chaos-mcp 是用于 Playwright 浏览器会话的 MCP 服务,供 AI Agent 在测试中模拟网络故障并检查应用响应。它覆盖延迟、断连、资源拦截、响应损坏及失败后恢复等情形。

主要功能

  1. 01模拟 API 状态码故障
  2. 02注入延迟并检查加载状态
  3. 03阻止指定网络资源
  4. 04模拟断连与系统网络错误
  5. 05测试失败重试和响应损坏
  6. 06断言故障处理结果

适用场景

  1. 01验证结账页对支付 API 故障的处理
  2. 02检查慢速 API 下的骨架屏
  3. 03确认屏蔽分析脚本后主要内容仍可用
  4. 04测试请求失败后的重试与恢复

MCP 相关

此 MCP 服务为 AI Agent 提供控制 Playwright 会话网络行为的工具,包括注入故障、拦截请求及断言应用是否正确处理故障。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"vola-trebla-playwright-network-chaos": {
"command": "npx",
"args": [
"-y",
"playwright-network-chaos-mcp"
]
}
}
}
启动命令npx -y playwright-network-chaos-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmplaywright-network-chaos-mcp0.2.1

工具

8

收录的工具列表 · 更新于 2 周前

参数类型必填说明
urlstring是要测试的页面 URL
wait_msinteger否导航后等待的毫秒数,然后检查回退界面(默认值:2000)
viewportobject否视口大小(默认值:1280×720)
viewport.widthinteger是视口宽度,单位为 px
viewport.heightinteger是视口高度,单位为 px
status_codeinteger否要返回的 HTTP 错误状态码(默认值:503)
response_bodystring否为被拦截的请求返回的响应正文
fallback_selectorstring否预期出现的回退 UI 的 CSS 选择器(例如,'.error-boundary')
intercept_patternstring是要拦截的请求的 Glob 模式(例如,'**/api/payment**')

详细介绍

playwright-network-chaos-mcp 🐸💥

npm version npm downloads CI License: MIT

一个 MCP 服务,为 AI Agent 提供对 Playwright 浏览器会话的动态网络混沌控制。

你的测试运行在完美的网络上,但用户并非如此。这个 MCP 服务让 AI Agent 能够模拟 API 故障、注入延迟、在请求进行过程中中断连接,并屏蔽第三方资源,然后验证应用是否能妥善处理这些情况。


🤔 问题所在

CI 环境的网络连接完美无缺。API 在几毫秒内响应。CDN 从不宕机。因此测试总能通过——然而在生产环境中,支付服务返回 503、网络在结账过程中中断,或 Google Analytics 卡住 8 秒并冻结页面时,应用却会出故障。

编写 Playwright 测试的 AI Agent 无法引入或分析网络不稳定的情况。它们无法询问:

  • 🙈 支付 API 故障时,结账页面会显示错误状态吗?
  • 🙈 仪表盘 API 响应缓慢时,会显示骨架屏加载器吗?
  • 🙈 屏蔽所有跟踪脚本后,应用还能正常运行吗?
  • 🙈 订单提交后、响应到达前网络中断,会发生什么?

playwright-network-chaos-mcp 解决了这个问题。


🛠️ 工具

simulate_api_failure

拦截与指定模式匹配的请求,并强制返回错误状态码。检查应用是否显示备用 UI。

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

为匹配的请求添加人为延迟。检查应用等待期间是否显示加载状态。

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

中止指向指定 URL 模式的请求——用于测试第三方服务故障(分析服务、CDN、跟踪像素)。

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

延迟一段时间后中止正在进行的请求——模拟请求与响应之间的连接中断。

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

使用操作系统级错误代码中止请求——模拟 DNS 故障、防火墙拦截和连接重置。

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

让前 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

在协议层提供格式错误的响应——例如未闭合的 JSON、错误的 Content-Length 或截断的负载。

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

注入混沌 HTTP 状态,并返回结构化的通过/失败判定——仅当备用 UI 出现且没有未处理的 JS 异常时,chaos_survived 才为 true。

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

🚀 安装

npx playwright-network-chaos-mcp

或者全局安装:

npm install -g playwright-network-chaos-mcp
npx playwright install chromium
Claude Desktop 配置
{
  "mcpServers": {
    "playwright-network-chaos-mcp": {
      "command": "npx",
      "args": ["-y", "playwright-network-chaos-mcp"]
    }
  }
}

💡 Agent 提示词示例

"检查支付 API 返回 503 时,结账页面是否会显示恰当的错误状态"

"在仪表盘上模拟 3 秒的 API 延迟,并验证是否显示骨架屏加载器"

"屏蔽所有分析和跟踪脚本,并确认主要内容仍能加载"

"在订单提交请求进行过程中中断连接,并检查用户是否会看到错误消息"

"为 API 模拟 DNS 故障,并检查是否会渲染错误边界"

"让前 3 个请求失败,然后恢复成功——应用会自动重试并恢复吗?"

"注入格式错误的 JSON,并断言应用不会崩溃——返回混沌判定"


🔗 相关项目


📄 许可证

MIT © vola-trebla

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。