@szc-ft/mcp-szcd-client 0.28.0 → 0.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/opencode-extension/skills/local-browser-test/SKILL.md +158 -32
- package/opencode-extension/skills/local-browser-test/lib/ant-adapter.js +716 -0
- package/opencode-extension/skills/local-browser-test/lib/browser-engine.js +2275 -0
- package/opencode-extension/skills/local-browser-test/lib/chrome-finder.js +125 -0
- package/opencode-extension/skills/local-browser-test/lib/expect.js +392 -0
- package/opencode-extension/skills/local-browser-test/lib/shared-deps.js +137 -0
- package/opencode-extension/skills/local-browser-test/lib/test-plan.js +48 -0
- package/opencode-extension/skills/local-browser-test/lib/visual-compare.js +192 -0
- package/opencode-extension/skills/local-browser-test/local-browser-executor.js +735 -0
- package/package.json +1 -1
- package/qwen-extension/qwen-extension.json +1 -1
- package/qwen-extension/skills/local-browser-test/SKILL.md +158 -32
- package/qwen-extension/skills/local-browser-test/lib/ant-adapter.js +716 -0
- package/qwen-extension/skills/local-browser-test/lib/browser-engine.js +2275 -0
- package/qwen-extension/skills/local-browser-test/lib/chrome-finder.js +125 -0
- package/qwen-extension/skills/local-browser-test/lib/expect.js +392 -0
- package/qwen-extension/skills/local-browser-test/lib/shared-deps.js +137 -0
- package/qwen-extension/skills/local-browser-test/lib/test-plan.js +48 -0
- package/qwen-extension/skills/local-browser-test/lib/visual-compare.js +192 -0
- package/qwen-extension/skills/local-browser-test/local-browser-executor.js +735 -0
- package/standard-skill/local-browser-test/SKILL.md +158 -32
- package/standard-skill/local-browser-test/lib/ant-adapter.js +716 -0
- package/standard-skill/local-browser-test/lib/browser-engine.js +2275 -0
- package/standard-skill/local-browser-test/lib/chrome-finder.js +125 -0
- package/standard-skill/local-browser-test/lib/expect.js +392 -0
- package/standard-skill/local-browser-test/lib/shared-deps.js +137 -0
- package/standard-skill/local-browser-test/lib/test-plan.js +48 -0
- package/standard-skill/local-browser-test/lib/visual-compare.js +192 -0
- package/standard-skill/local-browser-test/local-browser-executor.js +735 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: local-browser-test
|
|
3
|
-
description:
|
|
3
|
+
description: 在用户真实 Chrome 中执行自动化测试,覆盖 P0 用例批量执行、深度表单填写、微前端测试、长任务生命周期、设计稿对比、JS 错误诊断。通过 puppeteer-core 连接 CDP,天然继承登录态/微前端环境。
|
|
4
4
|
compatibility:
|
|
5
5
|
tools:
|
|
6
6
|
- run_command
|
|
@@ -11,29 +11,155 @@ compatibility:
|
|
|
11
11
|
|
|
12
12
|
## 触发条件
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
- "测试一下"、"帮我验证"、"浏览器测试"、"接管浏览器"
|
|
16
|
-
- "对比设计稿"、"还原度"、"看看效果"
|
|
17
|
-
- "功能测试"、"能不能正常用"
|
|
18
|
-
- "检查页面"、"页面渲染"
|
|
14
|
+
当用户出现以下意图时启动:
|
|
19
15
|
|
|
20
|
-
|
|
16
|
+
**用例自动化(用 testCase DSL):**
|
|
17
|
+
- "执行 P0 用例" / "批量测试" / "测试用例自动化"
|
|
18
|
+
- "创建→审核→上线 全链路" / "生命周期测试"
|
|
19
|
+
- "表单填写验证" / "深度表单测试"
|
|
20
|
+
|
|
21
|
+
**轻量诊断(用 --action diagnose):**
|
|
22
|
+
- "测试一下" / "检查页面" / "看看效果" / "能不能正常用"
|
|
23
|
+
- "JS 错误" / "页面渲染" / "API 检查"
|
|
24
|
+
|
|
25
|
+
**视觉对比(用 --action compare):**
|
|
26
|
+
- "对比设计稿" / "还原度" / "像素对比"
|
|
27
|
+
|
|
28
|
+
## ⚡ 路径解析(必读,避免 ad-hoc 脚本)
|
|
29
|
+
|
|
30
|
+
**执行器内置在 skill 目录中(自包含),会话开始时先解析 skill 路径:**
|
|
21
31
|
|
|
22
|
-
|
|
32
|
+
```bash
|
|
33
|
+
# 解析 skill 目录路径(执行器 + lib 都在 skill 目录内)
|
|
34
|
+
export SKILL_DIR=$(node -p "
|
|
35
|
+
const path = require('path');
|
|
36
|
+
// 尝试从 npm 包解析
|
|
37
|
+
try { return path.dirname(require.resolve('@szc-ft/mcp-szcd-client/standard-skill/local-browser-test/SKILL.md')); } catch {}
|
|
38
|
+
// 尝试从 IDE skill 目录查找
|
|
39
|
+
const os = require('os');
|
|
40
|
+
const candidates = [
|
|
41
|
+
path.join(os.homedir(), '.qwen/extensions/szcd-component-helper/skills/local-browser-test'),
|
|
42
|
+
path.join(os.homedir(), '.claude/skills/local-browser-test'),
|
|
43
|
+
path.join(os.homedir(), '.config/opencode/skills/local-browser-test'),
|
|
44
|
+
path.join(os.homedir(), '.trae-cn/skills/local-browser-test'),
|
|
45
|
+
path.join(os.homedir(), '.qoder/skills/local-browser-test'),
|
|
46
|
+
];
|
|
47
|
+
for (const c of candidates) {
|
|
48
|
+
if (require('fs').existsSync(path.join(c, 'local-browser-executor.js'))) return c;
|
|
49
|
+
}
|
|
50
|
+
throw new Error('local-browser-test skill not found');
|
|
51
|
+
")
|
|
52
|
+
echo "SKILL_DIR=$SKILL_DIR"
|
|
53
|
+
|
|
54
|
+
# 执行器路径
|
|
55
|
+
export EXECUTOR="$SKILL_DIR/local-browser-executor.js"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
后续所有命令直接 `node "$EXECUTOR" --action ...`。
|
|
59
|
+
|
|
60
|
+
**执行器 + lib 内置在 skill 目录中,自带 Ant 适配层 + expect 断言 + testCase 引擎。禁止自己 require puppeteer 写脚本**——自写脚本会丢失:
|
|
61
|
+
- 微前端 frame 探活 + 自动召回
|
|
62
|
+
- `closeAllDropdowns` 跨 frame 清理
|
|
63
|
+
- Ant Select mousedown + VERIFY 回写
|
|
64
|
+
- testCase recovery 重试
|
|
65
|
+
- API 按 frame scope 过滤
|
|
66
|
+
|
|
67
|
+
### 过渡兼容执行器
|
|
68
|
+
|
|
69
|
+
`local-browser-executor.cjs`(同目录)是 CommonJS 过渡版,仅支持基础诊断(diagnose/screenshot/list-pages/api-check/plan/snapshot/interact/perf/watch)。**Ant 适配层 / testCase DSL / expect 断言仅 `local-browser-executor.js`(ES Module 版)支持。** 优先用 `.js` 版本。
|
|
70
|
+
|
|
71
|
+
## 🎯 三种典型任务(场景驱动)
|
|
72
|
+
|
|
73
|
+
### 任务 A:P0 用例批量执行(首选)
|
|
74
|
+
|
|
75
|
+
用户说"执行 P0 用例 / 批量测试 / 生命周期测试"时,**不要写 ad-hoc puppeteer 脚本**,构造 testCase JSON:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
cat > /tmp/case.json <<'EOF'
|
|
79
|
+
{
|
|
80
|
+
"title": "数据集创建 P0",
|
|
81
|
+
"setup": { "findFrame": { "contentContains": "数据集目录" } },
|
|
82
|
+
"dataset": [
|
|
83
|
+
{ "name": "测试集A", "type": "图像" },
|
|
84
|
+
{ "name": "测试集B", "type": "文本" }
|
|
85
|
+
],
|
|
86
|
+
"steps": [
|
|
87
|
+
{ "type": "formFill", "fields": [
|
|
88
|
+
{ "label": "名称", "type": "input", "value": "{{name}}" },
|
|
89
|
+
{ "label": "资源类型", "type": "select", "value": "{{type}}" },
|
|
90
|
+
{ "label": "审核结果", "type": "radio", "value": "通过" }
|
|
91
|
+
], "validateAfter": true },
|
|
92
|
+
{ "type": "act", "click": "text=提 交" },
|
|
93
|
+
{ "type": "expect", "assertion": "url.toContain", "value": "/list" },
|
|
94
|
+
{ "type": "expect", "assertion": "api.toAllPass", "scope": "current-frame" }
|
|
95
|
+
],
|
|
96
|
+
"recovery": { "maxRetriesPerStep": 2 }
|
|
97
|
+
}
|
|
98
|
+
EOF
|
|
99
|
+
node "$EXECUTOR" --action test-case --test-case-file /tmp/case.json --test-report /tmp/report.json
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
dataset 数组每行跑一遍同样的 steps,`{{name}}` / `{{type}}` 自动替换。`setup.findFrame` 一次定位后所有步骤自动走子应用 frame(微前端默认行为)。
|
|
103
|
+
|
|
104
|
+
### 任务 B:深度表单填写(Ant Design + 微前端)
|
|
105
|
+
|
|
106
|
+
用户描述"填表单 / Select 选项 / TreeSelect / 挂接资源"时,用单步 antXxx 或 formFill:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# 单字段
|
|
110
|
+
node "$EXECUTOR" --action act --frame-content-contains "数据集" \
|
|
111
|
+
--selector ant-select=资源类型 --click ... # ❌ 不要这样
|
|
112
|
+
|
|
113
|
+
# ✅ 用 testCase 的 antSelect 步骤(在 testCase.steps 内):
|
|
114
|
+
# { "type": "antSelect", "field": "资源类型", "option": "图像" }
|
|
115
|
+
# { "type": "antTreeSelect", "field": "分类", "path": ["AI", "视觉"] }
|
|
116
|
+
# { "type": "antInput", "placeholder": "挂接资源", "value": "abc" }
|
|
117
|
+
# { "type": "antRadio", "field": "审核结果", "option": "通过" }
|
|
118
|
+
# { "type": "formFill", "fields": [...], "validateAfter": true }
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**关键约束(执行器已内置,无需手写):**
|
|
122
|
+
- Ant Select 必须 mousedown(不是 click)
|
|
123
|
+
- 浮层异步渲染 15×200ms 轮询
|
|
124
|
+
- 每次操作前后 `closeAllDropdowns` 防串选
|
|
125
|
+
- VERIFY 回写检查 `.ant-select-selection-item`
|
|
126
|
+
|
|
127
|
+
### 任务 C:轻量诊断(看页面是否正常)
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# 一次性看 JS 错误 + API 失败 + iframe 状态
|
|
131
|
+
node "$EXECUTOR" --action diagnose --url-contains "platform.aicityos.com" --wait 10000
|
|
132
|
+
|
|
133
|
+
# 仅看 API
|
|
134
|
+
node "$EXECUTOR" --action api-capture --url-contains "platform.aicityos.com" \
|
|
135
|
+
--url-pattern "/api/" --wait 10000 --include-response-body \
|
|
136
|
+
--output /tmp/api.json
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 主链路定位
|
|
23
142
|
|
|
24
143
|
```
|
|
25
144
|
Agent / SKILL.md
|
|
26
|
-
→
|
|
27
|
-
→
|
|
145
|
+
→ testCase JSON ← P0 用例首选入口
|
|
146
|
+
→ $SKILL_DIR/local-browser-executor.js ($EXECUTOR)
|
|
147
|
+
→ $SKILL_DIR/lib/browser-engine.js (executeTestCase + Ant 适配 + expect)
|
|
148
|
+
→ $SKILL_DIR/lib/ant-adapter.js (Select/TreeSelect/Input/Radio/...)
|
|
149
|
+
→ $SKILL_DIR/lib/expect.js (validation/locator/url/api + poll)
|
|
28
150
|
→ puppeteer-core + CDP
|
|
29
151
|
→ 用户真实 Chrome / Edge
|
|
30
152
|
```
|
|
31
153
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
154
|
+
执行器 + lib 内置在 skill 目录中(自包含),`postinstall` 会把整个 skill 目录复制到各 IDE。
|
|
155
|
+
**禁止 AI 在用户机器上写 ad-hoc puppeteer 脚本**——会丢失:
|
|
156
|
+
- 微前端 frame 探活 + 自动召回
|
|
157
|
+
- `closeAllDropdowns` 跨 frame 清理
|
|
158
|
+
- Ant Select VERIFY 回写
|
|
159
|
+
- testCase recovery 重试
|
|
160
|
+
- API 按 frame scope 过滤
|
|
35
161
|
|
|
36
|
-
`
|
|
162
|
+
`local-browser-executor.cjs`(同目录)是 CommonJS 过渡版,仅支持基础诊断。**Ant 适配层 / testCase DSL / expect 断言仅 `local-browser-executor.js`(ES Module 版)支持。**
|
|
37
163
|
|
|
38
164
|
## 浏览器模式
|
|
39
165
|
|
|
@@ -218,7 +344,7 @@ wujie 微前端子应用渲染在 blob URL iframe 中,**坐标点击无法到
|
|
|
218
344
|
|
|
219
345
|
### 结构化观察(主链路起点)
|
|
220
346
|
```bash
|
|
221
|
-
node
|
|
347
|
+
node "$EXECUTOR" \
|
|
222
348
|
--action observe \
|
|
223
349
|
--url-contains "platform.aicityos.com" \
|
|
224
350
|
--frame-content-contains "数据集目录" \
|
|
@@ -230,7 +356,7 @@ node {client_path}/local-browser-executor.js \
|
|
|
230
356
|
|
|
231
357
|
### 观察后按 index 交互(主链路闭环)
|
|
232
358
|
```bash
|
|
233
|
-
node
|
|
359
|
+
node "$EXECUTOR" \
|
|
234
360
|
--action act \
|
|
235
361
|
--url-contains "platform.aicityos.com" \
|
|
236
362
|
--frame-content-contains "数据集目录" \
|
|
@@ -241,7 +367,7 @@ node {client_path}/local-browser-executor.js \
|
|
|
241
367
|
|
|
242
368
|
### 左侧菜单路径稳定点击
|
|
243
369
|
```bash
|
|
244
|
-
node
|
|
370
|
+
node "$EXECUTOR" \
|
|
245
371
|
--action act \
|
|
246
372
|
--url-contains "platform.aicityos.com" \
|
|
247
373
|
--menu-path "目录管理/数据集目录" \
|
|
@@ -253,7 +379,7 @@ node {client_path}/local-browser-executor.js \
|
|
|
253
379
|
|
|
254
380
|
### 轻量 DOM 断言
|
|
255
381
|
```bash
|
|
256
|
-
node
|
|
382
|
+
node "$EXECUTOR" \
|
|
257
383
|
--action assert \
|
|
258
384
|
--url-contains "platform.aicityos.com" \
|
|
259
385
|
--selector ".ant-table" \
|
|
@@ -264,7 +390,7 @@ node {client_path}/local-browser-executor.js \
|
|
|
264
390
|
|
|
265
391
|
### API 请求/响应捕获(真实浏览器 + 微前端)
|
|
266
392
|
```bash
|
|
267
|
-
node
|
|
393
|
+
node "$EXECUTOR" \
|
|
268
394
|
--action api-capture \
|
|
269
395
|
--url-contains "platform.aicityos.com" \
|
|
270
396
|
--frame-content-contains "数据集目录" \
|
|
@@ -279,7 +405,7 @@ node {client_path}/local-browser-executor.js \
|
|
|
279
405
|
|
|
280
406
|
### API 捕获结果断言
|
|
281
407
|
```bash
|
|
282
|
-
node
|
|
408
|
+
node "$EXECUTOR" \
|
|
283
409
|
--action assert-api \
|
|
284
410
|
--capture-file /tmp/browser-api-capture.json \
|
|
285
411
|
--max-failed 0 \
|
|
@@ -292,7 +418,7 @@ node {client_path}/local-browser-executor.js \
|
|
|
292
418
|
|
|
293
419
|
### 快速诊断(过渡兼容)
|
|
294
420
|
```bash
|
|
295
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
421
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
296
422
|
--action diagnose \
|
|
297
423
|
--url-contains "platform.aicityos.com" \
|
|
298
424
|
--wait 15000 \
|
|
@@ -301,13 +427,13 @@ NODE_PATH=~/.szcd-mcp/deps/node_modules node {skill_path}/local-browser-executor
|
|
|
301
427
|
|
|
302
428
|
### 列出所有标签页
|
|
303
429
|
```bash
|
|
304
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
430
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
305
431
|
--action list-pages
|
|
306
432
|
```
|
|
307
433
|
|
|
308
434
|
### 检查 API 请求状态
|
|
309
435
|
```bash
|
|
310
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
436
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
311
437
|
--action api-check \
|
|
312
438
|
--url-contains "platform.aicityos.com" \
|
|
313
439
|
--wait 15000
|
|
@@ -315,7 +441,7 @@ NODE_PATH=~/.szcd-mcp/deps/node_modules node {skill_path}/local-browser-executor
|
|
|
315
441
|
|
|
316
442
|
### 截图
|
|
317
443
|
```bash
|
|
318
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
444
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
319
445
|
--action screenshot \
|
|
320
446
|
--url-contains "platform.aicityos.com" \
|
|
321
447
|
--filename current-page.png \
|
|
@@ -324,7 +450,7 @@ NODE_PATH=~/.szcd-mcp/deps/node_modules node {skill_path}/local-browser-executor
|
|
|
324
450
|
|
|
325
451
|
### 执行测试计划 JSON
|
|
326
452
|
```bash
|
|
327
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
453
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
328
454
|
--action plan \
|
|
329
455
|
--plan-file /tmp/test-plan.json \
|
|
330
456
|
--output /tmp/browser-test-result.json
|
|
@@ -332,7 +458,7 @@ NODE_PATH=~/.szcd-mcp/deps/node_modules node {skill_path}/local-browser-executor
|
|
|
332
458
|
|
|
333
459
|
### DOM 快照(结构化页面树,类似 browser-use take_snapshot)
|
|
334
460
|
```bash
|
|
335
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
461
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
336
462
|
--action snapshot \
|
|
337
463
|
--url-contains "platform.aicityos.com" \
|
|
338
464
|
--depth 4 \
|
|
@@ -353,25 +479,25 @@ NODE_PATH=~/.szcd-mcp/deps/node_modules node {skill_path}/local-browser-executor
|
|
|
353
479
|
### 智能交互(支持 text=、role=、~ 选择器,类似 Playwright)
|
|
354
480
|
```bash
|
|
355
481
|
# 点击包含“构建”文本的按钮
|
|
356
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
482
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
357
483
|
--action interact \
|
|
358
484
|
--url-contains "jenkins" \
|
|
359
485
|
--click "text=Build"
|
|
360
486
|
|
|
361
487
|
# 在输入框中输入文本
|
|
362
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
488
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
363
489
|
--action interact \
|
|
364
490
|
--click "#search-input" \
|
|
365
491
|
--type "hello world"
|
|
366
492
|
|
|
367
493
|
# 悬停 + 截图
|
|
368
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
494
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
369
495
|
--action interact \
|
|
370
496
|
--hover "~ant-menu-item" \
|
|
371
497
|
--screenshot-after
|
|
372
498
|
|
|
373
499
|
# 滚动页面
|
|
374
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
500
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
375
501
|
--action interact \
|
|
376
502
|
--scroll down --scroll-amount 500
|
|
377
503
|
```
|
|
@@ -383,14 +509,14 @@ NODE_PATH=~/.szcd-mcp/deps/node_modules node {skill_path}/local-browser-executor
|
|
|
383
509
|
|
|
384
510
|
### 性能指标采集(FCP/TTFB/资源统计)
|
|
385
511
|
```bash
|
|
386
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
512
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
387
513
|
--action perf \
|
|
388
514
|
--url-contains "platform.aicityos.com"
|
|
389
515
|
```
|
|
390
516
|
|
|
391
517
|
### 持续监控模式(定时截图 + 错误检测)
|
|
392
518
|
```bash
|
|
393
|
-
NODE_PATH=~/.szcd-mcp/deps/node_modules node
|
|
519
|
+
NODE_PATH=~/.szcd-mcp/deps/node_modules node "$SKILL_DIR/local-browser-executor.cjs" \
|
|
394
520
|
--action watch \
|
|
395
521
|
--url-contains "platform.aicityos.com" \
|
|
396
522
|
--interval 5000 \
|