Install
openclaw skills install @paudyyin/browser-testing-toolkit浏览器测试与自动化工具包。三层架构:L1快速验证(playwright-cli)、L2深度调试(DevTools)、L3复杂测试(Python+E2E)。v1.1 新增智能点击(自动处理遮挡)。
openclaw skills install @paudyyin/browser-testing-toolkit三层架构,自动根据任务类型选择最优分支:
| 层级 | 工具 | 适用场景 | 触发关键词 |
|---|---|---|---|
| L1: 快速验证 | playwright-cli | 简单截图、表单填写、快速检查 | screenshot, click, fill, simple |
| L2: 深度调试 | Chrome DevTools | UI Bug、网络问题、性能分析 | debug, network, performance, console |
| L3: 复杂测试 | Python Playwright | E2E 测试、多服务器、自动化流程 | e2e, test, automation, server |
| 智能点击 | smart_click | 元素被遮挡时自动处理 | obscured, blocked, cookie, modal, overlay |
根据用户意图自动选择层级:
用户任务 → 分析意图
├─ 简单操作(截图/点击/填写)→ L1: playwright-cli
├─ 调试问题(UI/网络/性能)→ L2: DevTools
├─ 复杂测试(E2E/多服务器)→ L3: Python Playwright
└─ 点击被遮挡(cookie/modal/overlay)→ 智能点击: smart_click
# 基础操作
playwright-cli open https://example.com
playwright-cli screenshot
playwright-cli click e15
playwright-cli fill e5 "text"
# 导航
playwright-cli goto https://example.com
playwright-cli go-back
playwright-cli reload
# 快照与检查
playwright-cli snapshot
playwright-cli eval "document.title"
# 关闭
playwright-cli close
# 多会话并行
playwright-cli -s=session1 open https://example.com
playwright-cli -s=session2 open https://other.com
# 列出所有会话
playwright-cli list
# 关闭所有
playwright-cli close-all
# 路由拦截
playwright-cli route "**/*.jpg" --status=404
playwright-cli route "https://api.example.com/**" --body='{"mock": true}'
--isolated),不访问真实登录状态1. REPRODUCE
└── 导航到页面,触发 Bug
└── 截图确认视觉状态
2. INSPECT
├── 检查控制台错误/警告
├── 检查 DOM 元素
├── 读取计算样式
└── 检查无障碍树
3. DIAGNOSE
├── 对比实际 DOM vs 预期结构
├── 对比实际样式 vs 预期样式
├── 检查数据是否正确到达组件
└── 定位根因(HTML? CSS? JS? 数据?)
4. FIX
└── 在源代码中实现修复
5. VERIFY
├── 重新加载页面
├── 截图对比(与 Step 1)
├── 确认控制台干净
└── 运行自动化测试
1. CAPTURE
└── 打开网络监控,触发动作
2. ANALYZE
├── 检查请求 URL、方法、headers
├── 验证请求 payload
├── 检查响应状态码
├── 检查响应 body
└── 检查时序(慢?超时?)
3. DIAGNOSE
├── 4xx → 客户端发送错误数据或 URL
├── 5xx → 服务器错误(检查服务器日志)
├── CORS → 检查 origin headers 和服务器配置
├── Timeout → 检查服务器响应时间 / payload 大小
└── Missing request → 检查代码是否实际发送
4. FIX & VERIFY
└── 修复问题,重放动作,确认响应
1. BASELINE
└── 记录当前行为的性能 trace
2. IDENTIFY
├── 检查 LCP (Largest Contentful Paint)
├── 检查 CLS (Cumulative Layout Shift)
├── 检查 INP (Interaction to Next Paint)
├── 识别长任务 (> 50ms)
└── 检查不必要的重渲染
3. FIX
└── 解决具体瓶颈
4. MEASURE
└── 记录新的 trace,与 baseline 对比
ERROR 级别:
├── 未捕获异常 → 代码 Bug
├── 失败的网络请求 → API 或 CORS 问题
├── React/Vue 警告 → 组件问题
└── 安全警告 → CSP、混合内容
WARN 级别:
├── 弃用警告 → 未来兼容性问题
├── 性能警告 → 潜在瓶颈
└── 无障碍警告 → a11y 问题
LOG 级别:
└── 调试输出 → 验证应用状态和流程
干净控制台标准:生产质量页面应该零控制台错误和警告。
1. 读取无障碍树
└── 确认所有交互元素有无障碍名称
2. 检查标题层级
└── h1 → h2 → h3(不跳过层级)
3. 检查焦点顺序
└── Tab 遍历页面,验证逻辑顺序
4. 检查颜色对比度
└── 验证文本达到 4.5:1 最小比率
5. 检查动态内容
└── 验证 ARIA live regions 播报变化
使用 scripts/with_server.py 管理服务器:
# 单服务器
python scripts/with_server.py --server "npm run dev" --port 5173 -- python test.py
# 多服务器(后端 + 前端)
python scripts/with_server.py \
--server "cd backend && python server.py" --port 3000 \
--server "cd frontend && npm run dev" --port 5173 \
-- python test.py
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
# 导航到应用
page.goto('http://localhost:5173')
# 关键:等待 JS 执行完成
page.wait_for_load_state('networkidle')
# 侦察阶段:截图检查
page.screenshot(path='before.png', full_page=True)
# 执行测试逻辑
page.click('button.submit')
page.wait_for_selector('.success-message')
# 验证
assert page.locator('.success-message').is_visible()
browser.close()
用户任务 → 是静态 HTML?
├─ 是 → 直接读取 HTML 文件识别选择器
│ ├─ 成功 → 使用 Playwright 脚本
│ └─ 失败/不完整 → 按动态应用处理
└─ 否(动态应用)→ 服务器已运行?
├─ 否 → 使用 with_server.py + Playwright 脚本
└─ 是 → 侦察后行动:
1. 导航并等待 networkidle
2. 截图或检查 DOM
3. 从渲染状态识别选择器
4. 使用发现的选择器执行动作
# 1. 侦察:检查渲染的 DOM
page.screenshot(path='/tmp/inspect.png', full_page=True)
content = page.content()
buttons = page.locator('button').all()
# 2. 从侦察结果识别选择器
# 3. 使用发现的选择器执行动作
page.click('button.submit')
networkidle 前检查 DOMpage.wait_for_load_state('networkidle')解决 Playwright 点击元素时被其他元素遮挡导致失败的问题。
browser click 报错 element is obscured / interceptedfrom smart_click import SmartClick, smart_click, wait_for_clickable
# 一行调用智能点击
result = await smart_click(page, '#submit-btn')
if result.success:
print("Clicked!")
else:
print(f"Failed: {result.message}")
if result.blocked:
print(f"Blocked by: {result.blocker}")
# 等待元素可点击
clickable = await wait_for_clickable(page, '#btn', timeout=5000)
if clickable:
await page.click('#btn')
# 高级用法:带重试的点击
sc = SmartClick(auto_dismiss=True, max_retries=3)
result = await sc.click_with_retry(page, '#btn', max_retries=3)
| 遮挡类型 | 检测方法 | 处理策略 |
|---|---|---|
| Cookie Banner | class/id 包含 cookie/consent/gdpr | 点击 Accept/同意/允许 按钮 |
| Modal/Dialog | role=dialog 或 class 包含 modal/popup | 点击 × 关闭按钮,或按 Escape |
| Fixed Header | style 包含 position:fixed/sticky | 滚动页面后重试 |
| 未知遮挡 | elementFromPoint 检测 | 按 Escape 后重试 |
{
"success": true,
"target": {"selector": "#submit-btn", "text": "Submit"},
"blocked": false,
"blocker": null,
"retry_count": 0,
"message": "Clicked successfully"
}
被遮挡时:
{
"success": false,
"target": {"selector": "#submit-btn", "text": "Submit"},
"blocked": true,
"blocker": {
"tag": "div",
"class_name": "cookie-banner",
"text": "We use cookies",
"bounding_box": {"x": 0, "y": 0, "width": 800, "height": 100}
},
"retry_count": 1,
"message": "Element blocked by: <div class=\"cookie-banner\">"
}
browser snapshot 获取页面状态browser act kind=click 尝试点击from smart_click import smart_click
result = await smart_click(page, '#target')
browser act evaluate 直接使用遮挡检测 JS对于复杂 UI 问题,编写结构化测试计划:
## 测试计划:任务完成动画 Bug
### 设置
1. 导航到 http://localhost:3000/tasks
2. 确保至少有 3 个任务
### 步骤
1. 点击第一个任务的复选框
- 预期:任务显示删除线动画,移动到"已完成"部分
- 检查:控制台应无错误
- 检查:网络应显示 PATCH /api/tasks/:id with { status: "completed" }
2. 在 3 秒内点击撤销
- 预期:任务返回活动列表,反向动画
- 检查:控制台应无错误
- 检查:网络应显示 PATCH /api/tasks/:id with { status: "pending" }
3. 快速切换同一任务 5 次
- 预期:无视觉故障,最终状态一致
- 检查:无控制台错误,无重复网络请求
- 检查:DOM 应只显示任务的一个实例
### 验证
- [ ] 所有步骤完成无控制台错误
- [ ] 网络请求正确且未重复
- [ ] 视觉状态符合预期行为
- [ ] 无障碍:任务状态变化被屏幕阅读器播报
使用截图进行视觉回归测试:
1. 拍摄"before"截图
2. 进行代码更改
3. 重新加载页面
4. 拍摄"after"截图
5. 对比:更改是否正确?
特别适用于:
任何浏览器相关更改最终验证:
browser-testing-toolkit/
├── SKILL.md # 本文档
├── scripts/
│ ├── with_server.py # 服务器生命周期管理
│ ├── smart_click.py # 智能点击封装层(v1.1 新增)
│ └── test_smart_click.py # 智能点击测试用例
└── references/
├── security.md # 安全边界详细说明
└── debugging.md # 调试工作流详细说明
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.1.0 | 2026-08-01 | 合并 browser-smart-click:新增智能点击模块(遮挡检测+自动关闭+重试) |
| v1.0.0 | 2026-07-31 | 合并 browser-testing-with-devtools + playwright-cli + webapp-testing |
三层架构 + 智能点击,自动选择最优测试策略。