@zhouhao4221/devflow-skills 0.2.0 → 0.3.1

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.
Files changed (83) hide show
  1. package/README.md +57 -235
  2. package/install.js +406 -116
  3. package/package.json +2 -1
  4. package/plugins/api/skills/api/SKILL.md +102 -0
  5. package/plugins/api/skills/api-field-mapper/SKILL.md +95 -0
  6. package/plugins/api/skills/config/SKILL.md +140 -0
  7. package/plugins/api/skills/gen/SKILL.md +345 -0
  8. package/plugins/api/skills/help/SKILL.md +121 -0
  9. package/plugins/api/skills/import/SKILL.md +95 -0
  10. package/plugins/api/skills/map/SKILL.md +152 -0
  11. package/plugins/api/skills/search/SKILL.md +95 -0
  12. package/plugins/diag/skills/audit/SKILL.md +103 -0
  13. package/plugins/diag/skills/diag/SKILL.md +41 -0
  14. package/plugins/diag/skills/diagnose/SKILL.md +167 -0
  15. package/plugins/diag/skills/init/SKILL.md +142 -0
  16. package/plugins/diag/skills/stack-analyzer/SKILL.md +150 -0
  17. package/plugins/pm/skills/ask/SKILL.md +89 -0
  18. package/plugins/pm/skills/brief/SKILL.md +95 -0
  19. package/plugins/pm/skills/export/SKILL.md +93 -0
  20. package/plugins/pm/skills/help/SKILL.md +257 -0
  21. package/plugins/pm/skills/milestone/SKILL.md +102 -0
  22. package/plugins/pm/skills/monthly/SKILL.md +111 -0
  23. package/plugins/pm/skills/plan/SKILL.md +96 -0
  24. package/plugins/pm/skills/pm/SKILL.md +174 -0
  25. package/plugins/pm/skills/progress/SKILL.md +113 -0
  26. package/plugins/pm/skills/report-generator/SKILL.md +104 -0
  27. package/plugins/pm/skills/risk/SKILL.md +223 -0
  28. package/plugins/pm/skills/standup/SKILL.md +96 -0
  29. package/plugins/pm/skills/stats/SKILL.md +158 -0
  30. package/plugins/pm/skills/weekly/SKILL.md +157 -0
  31. package/plugins/req/skills/branch/SKILL.md +447 -0
  32. package/plugins/req/skills/cache/SKILL.md +232 -0
  33. package/plugins/req/skills/changelog/SKILL.md +187 -0
  34. package/plugins/req/skills/changelog-generator/SKILL.md +106 -0
  35. package/plugins/req/skills/code-impact-analyzer/SKILL.md +48 -0
  36. package/plugins/req/skills/commit/SKILL.md +308 -0
  37. package/plugins/req/skills/dev/SKILL.md +229 -0
  38. package/plugins/req/skills/dev-guide/SKILL.md +530 -0
  39. package/plugins/req/skills/do/SKILL.md +191 -0
  40. package/plugins/req/skills/done/SKILL.md +95 -0
  41. package/plugins/req/skills/edit/SKILL.md +187 -0
  42. package/plugins/req/skills/fix/SKILL.md +300 -0
  43. package/plugins/req/skills/help/SKILL.md +136 -0
  44. package/plugins/req/skills/init/SKILL.md +505 -0
  45. package/plugins/req/skills/issue/SKILL.md +237 -0
  46. package/plugins/req/skills/issue-guide/SKILL.md +125 -0
  47. package/plugins/req/skills/migrate/SKILL.md +128 -0
  48. package/plugins/req/skills/modules/SKILL.md +195 -0
  49. package/plugins/req/skills/natural-language-dispatcher/SKILL.md +545 -0
  50. package/plugins/req/skills/new/SKILL.md +172 -0
  51. package/plugins/req/skills/new-quick/SKILL.md +246 -0
  52. package/plugins/req/skills/pr/SKILL.md +157 -0
  53. package/plugins/req/skills/prd/SKILL.md +187 -0
  54. package/plugins/req/skills/prd-analyzer/SKILL.md +131 -0
  55. package/plugins/req/skills/prd-edit/SKILL.md +201 -0
  56. package/plugins/req/skills/projects/SKILL.md +115 -0
  57. package/plugins/req/skills/quick-fix-guide/SKILL.md +51 -0
  58. package/plugins/req/skills/release/SKILL.md +300 -0
  59. package/plugins/req/skills/release-rationale/SKILL.md +213 -0
  60. package/plugins/req/skills/req/SKILL.md +173 -0
  61. package/plugins/req/skills/requirement-analyzer/SKILL.md +274 -0
  62. package/plugins/req/skills/review/SKILL.md +201 -0
  63. package/plugins/req/skills/review-pr/SKILL.md +699 -0
  64. package/plugins/req/skills/show/SKILL.md +302 -0
  65. package/plugins/req/skills/specs/SKILL.md +99 -0
  66. package/plugins/req/skills/split/SKILL.md +164 -0
  67. package/plugins/req/skills/status/SKILL.md +184 -0
  68. package/plugins/req/skills/test/SKILL.md +431 -0
  69. package/plugins/req/skills/test-guide/SKILL.md +304 -0
  70. package/plugins/req/skills/test_new/SKILL.md +417 -0
  71. package/plugins/req/skills/test_regression/SKILL.md +298 -0
  72. package/plugins/req/skills/update/SKILL.md +131 -0
  73. package/plugins/req/skills/update-template/SKILL.md +203 -0
  74. package/plugins/req/skills/upgrade/SKILL.md +178 -0
  75. package/plugins/req/skills/use/SKILL.md +158 -0
  76. package/plugins/req/skills/version-bumper/SKILL.md +113 -0
  77. package/plugins/uat/skills/bug/SKILL.md +153 -0
  78. package/plugins/uat/skills/init/SKILL.md +88 -0
  79. package/plugins/uat/skills/new/SKILL.md +131 -0
  80. package/plugins/uat/skills/report/SKILL.md +48 -0
  81. package/plugins/uat/skills/run/SKILL.md +78 -0
  82. package/plugins/uat/skills/uat/SKILL.md +64 -0
  83. package/plugins/uat/skills/uat-executor/SKILL.md +299 -0
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: new
3
+ description: |
4
+ 创建测试流程文档 - 多轮对话引导生成
5
+ ---
6
+
7
+ # 创建测试流程文档
8
+
9
+ > **Audience:** QA
10
+
11
+ 通过多轮对话收集测试场景,生成结构化的 flow 文档。
12
+
13
+ ## 命令格式
14
+
15
+ ```
16
+ /uat:new [module]
17
+ ```
18
+
19
+ ---
20
+
21
+ ## 执行流程
22
+
23
+ ### 1. 确定模块名
24
+
25
+ - 若参数已传入模块名,直接使用
26
+ - 否则询问:`请输入测试模块名称(如:用户登录、商品搜索)`
27
+
28
+ 检查 `docs/uat/flows/<module>.md` 是否已存在:
29
+ - 已存在 → 提示 `该模块已有测试文档,是否覆盖?(y/n)`
30
+ - 不存在 → 继续
31
+
32
+ ### 2. 读取模板
33
+
34
+ 读取 `plugins/uat/templates/flow-template.md`,了解 flow 文档结构。
35
+
36
+ ### 3. 选择创建方式
37
+
38
+ 询问:
39
+
40
+ ```
41
+ 如何创建测试流程文档?
42
+ [1] 代码分析(扫描路由/表单/接口,自动推导场景)
43
+ [2] 手动描述(逐场景对话录入)
44
+ ```
45
+
46
+ **选 [1] 代码分析**:
47
+
48
+ 扫描以下来源(自动检测,无需用户指定):
49
+ - 前端路由:`src/router/`, `src/routes/`, `router.ts`, `router.js`
50
+ - 表单组件:`src/` 下含 `<form`/`<el-form`/`<a-form`/`<van-form` 的 `.vue`/`.tsx`/`.jsx`,提取字段名、类型、校验规则(required/maxlength/pattern)
51
+ - API 接口文档:`openapi.yaml`, `swagger.json`, `docs/openapi.*`
52
+ - 后端路由:FastAPI `@router.*`、Express `router.*`、Spring `@*Mapping`、Go Gin `r.GET/POST`
53
+
54
+ 根据扫描结果推导场景(列表页→浏览、含 POST 的表单→新增、含 PUT 的表单→编辑、含 DELETE→删除),展示候选列表后由用户确认或调整,再进入阶段一补充基本信息(平台/入口/测试数据)。
55
+
56
+ 生成的文档元信息 `生成方式` 填写 `代码分析(/uat:new)`,步骤中标注字段来源(如 `来源:CustomerForm.vue:38`)。
57
+
58
+ **选 [2] 手动描述**:直接进入阶段一。
59
+
60
+ ---
61
+
62
+ ### 4. 多轮对话收集信息
63
+
64
+ **阶段一:收集基本信息**
65
+
66
+ 依次询问:
67
+ 1. 平台:`web / desktop / mobile-web`(默认 web)
68
+ 2. 入口 URL 或路径
69
+
70
+ **阶段二:收集全局信息**
71
+
72
+ 询问:
73
+ 1. 是否有全局测试数据?(账号、密码、通用字段值等)整理为 `测试数据` 表格。
74
+ 2. 是否有已知不通过 / 可跳过的路径?(如"接口已知返回 500 跳过")整理为 `已知结论` 列表。
75
+
76
+ **阶段三:逐轮收集测试场景**
77
+
78
+ 每轮询问:
79
+ ```
80
+ 请描述一个测试场景(输入"完成"结束):
81
+ - 场景名称?
82
+ - 前置条件?(用户状态、页面状态等)
83
+ - 场景类型?(新增 / 编辑 / 查询 / 删除 / 其他)
84
+ - 是否需要数据准备?(手动提前创建 / 已有数据 / 不需要)
85
+ - 若为「新增」场景:如何清理测试数据?(描述操作意图,如"找到该记录,点击删除")
86
+ - 操作步骤?(用自然语言描述做什么,不需要写选择器)
87
+ - 例:「在客户名称输入框输入「张三」」「点击保存按钮」「确认列表出现张三」
88
+ - 如果知道 data-testid 可以补充在括号里,如「点击保存按钮(testid: submit-btn)」
89
+ - 预期结果?(用自然语言描述可观察到的状态)
90
+ ```
91
+
92
+ AI 将用户描述整理为自然语言步骤,不强制写选择器。每收集完一个场景展示整理结果,询问 `是否继续添加场景?`。
93
+
94
+ **用户说"完成"后**进入阶段四。
95
+
96
+ **阶段四:表单边界 & 字符类型检测(自动触发)**
97
+
98
+ 分析已收集的场景,判断是否包含「输入框 / 表单提交」步骤:
99
+
100
+ - **有表单输入** → 主动询问:
101
+ ```
102
+ 检测到场景中有表单操作,建议补充「表单边界 & 字符类型」测试场景(覆盖空值、超长、特殊字符、XSS 等)。
103
+ 是否添加?(y/n)
104
+ ```
105
+ - `y` → 逐字段引导:
106
+ 1. 哪些字段需要测试?(逐一列出)
107
+ 2. 每个字段的:最大/最小长度限制是多少?是否有字符类型约束(仅数字/仅中文等)?
108
+ 3. 对空值/超长/特殊字符的预期行为是什么?(内联提示文字 / 截断 / 其他)
109
+ 4. 按模板 `SXX 表单边界 & 字符类型` 生成对应场景,自动填充字段清单和字段约束
110
+ - `n` → 跳过,提示 `后续可手动编辑 flow 文档添加边界测试场景`
111
+
112
+ - **无表单输入** → 跳过此阶段
113
+
114
+ ### 5. 生成文档
115
+
116
+ 严格按模板格式生成 `docs/uat/flows/<module>.md`:
117
+ - 创建 `docs/uat/flows/` 目录(如不存在)
118
+ - 场景 ID 按 S01、S02... 顺序编号
119
+ - `测试数据` 和 `已知结论` 区块必须写入(无内容时保留空占位符)
120
+
121
+ ### 6. 输出
122
+
123
+ ```
124
+ ✅ 测试流程文档已创建
125
+
126
+ docs/uat/flows/<module>.md
127
+ 场景数:3
128
+
129
+ /uat:run <module> 立即执行测试
130
+ 直接编辑:docs/uat/flows/<module>.md
131
+ ```
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: report
3
+ description: |
4
+ 查看测试报告 - 展示最近一次执行结果
5
+ ---
6
+
7
+ # 查看测试报告
8
+
9
+ > **Audience:** QA
10
+
11
+ 读取并展示最近一次 `/uat:run` 生成的测试报告。
12
+
13
+ ## 命令格式
14
+
15
+ ```
16
+ /uat:report [module]
17
+ ```
18
+
19
+ - 省略模块名:列出所有模块的最新报告供选择
20
+ - 指定模块名:直接展示该模块最新报告
21
+
22
+ ---
23
+
24
+ ## 执行流程
25
+
26
+ ### 1. 找到报告文件
27
+
28
+ 扫描 `docs/uat/reports/` 目录:
29
+ - 找到匹配模块名的所有报告文件(格式:`YYYY-MM-DD-<module>.md`)
30
+ - 取日期最新的一份
31
+
32
+ 若无报告文件:
33
+ ```
34
+ ❌ 暂无测试报告
35
+
36
+ 先执行 /uat:run <module> 生成报告
37
+ ```
38
+
39
+ ### 2. 展示报告
40
+
41
+ 直接展示报告文件内容(Markdown 格式,含汇总表和失败详情)。
42
+
43
+ 报告末尾追加操作提示:
44
+
45
+ ```
46
+ /uat:bug 将失败项上报为 Gitea issue
47
+ /uat:run 重新执行测试
48
+ ```
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: run
3
+ description: |
4
+ 执行 UAT 测试 - 按流程文档逐场景验收
5
+ ---
6
+
7
+ # 执行 UAT 测试
8
+
9
+ > **Audience:** QA
10
+
11
+ 读取测试流程文档,调用 uat-executor skill 逐场景执行,输出报告。
12
+
13
+ > **运行环境要求**:操作方式为 `browser` 时,必须在 **Codex Chrome** 或 **Claude 桌面客户端** 中运行,否则无法调用浏览器工具。
14
+
15
+ ## 命令格式
16
+
17
+ ```
18
+ /uat:run [module]
19
+ ```
20
+
21
+ - 省略模块名:列出所有 flow 文档,提示用户选择
22
+ - 指定模块名:直接执行对应 flow 文档
23
+
24
+ ---
25
+
26
+ ## 执行流程
27
+
28
+ ### 0. 前置检查:skill 是否已安装
29
+
30
+ 检查 `.claude/skills/uat-executor/SKILL.md` 是否存在:
31
+
32
+ - 存在 → 继续
33
+ - 不存在 → 终止并提示:
34
+
35
+ ```
36
+ ❌ uat-executor skill 未安装
37
+
38
+ 当前环境(Codex / Claude 桌面端)需要 skill 文件才能执行测试。
39
+ 请先在 Claude Code 中运行:/uat:init
40
+ ```
41
+
42
+ ### 1. 确定执行范围
43
+
44
+ - 有参数 → 查找 `docs/uat/flows/<module>.md`
45
+ - 无参数 → 列出所有 flow 文档,用户选择(支持"全部")
46
+
47
+ 若 flow 文件不存在:
48
+ ```
49
+ ❌ 未找到测试流程文档:docs/uat/flows/<module>.md
50
+ 使用 /uat:new <module> 创建
51
+ ```
52
+
53
+ ### 2. 激活 uat-executor skill
54
+
55
+ 读取 flow 文档后,按 `.claude/skills/uat-executor/SKILL.md` 的指导执行:
56
+
57
+ - 检查运行环境(browser 模式下确认浏览器工具可用)
58
+ - 逐场景执行并记录结果
59
+
60
+ ### 3. 写入报告
61
+
62
+ 执行完毕后:
63
+ 1. 创建 `docs/uat/screenshots/` 目录(如不存在)
64
+ 2. 将报告写入 `docs/uat/reports/YYYY-MM-DD-<module>.md`(含「发现记录」节,若有发现项)
65
+ 3. 更新 flow 文档元信息的 `最后执行` 字段
66
+
67
+ ### 4. 输出汇总
68
+
69
+ 在终端展示执行汇总(格式见 uat-executor skill),并提示:
70
+
71
+ ```
72
+ 报告已保存:docs/uat/reports/YYYY-MM-DD-<module>.md
73
+
74
+ /uat:report 查看完整报告
75
+ /uat:bug 将失败项(代码 bug)上报为 issue
76
+ ```
77
+
78
+ **注**:执行中发现流程文档描述有误时直接更新 `docs/uat/flows/<module>.md`,无需额外操作。
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: uat
3
+ description: |
4
+ UAT 测试工作流 - 列出测试模块和上次执行状态
5
+ ---
6
+
7
+ # UAT 测试工作流
8
+
9
+ > **Audience:** QA
10
+
11
+ 列出所有测试流程模块及其上次执行状态。
12
+
13
+ ## 命令格式
14
+
15
+ ```
16
+ /uat
17
+ ```
18
+
19
+ ## 子命令
20
+
21
+ | 命令 | 说明 |
22
+ |------|------|
23
+ | `/uat:init` | 初始化 UAT 插件(首次使用必须执行) |
24
+ | `/uat:new [module]` | 创建测试流程文档(对话录入或代码分析) |
25
+ | `/uat:run [module]` | 执行测试(需 Codex Chrome 或 Claude 桌面端) |
26
+ | `/uat:report` | 查看最近一次测试报告 |
27
+ | `/uat:bug` | 将失败场景上报为 issue |
28
+
29
+ ---
30
+
31
+ ## 执行流程
32
+
33
+ ### 1. 扫描测试流程文档
34
+
35
+ 扫描 `docs/uat/flows/` 目录,读取所有 `*.md` 文件的元信息(模块名、操作方式、最后执行日期)。
36
+
37
+ ### 2. 扫描最近报告
38
+
39
+ 扫描 `docs/uat/reports/` 目录,找到每个模块最新的报告文件,提取通过/失败数。
40
+
41
+ ### 3. 输出
42
+
43
+ ```
44
+ UAT 测试模块
45
+
46
+ 模块 操作方式 最后执行 结果
47
+
48
+ 用户登录 browser 2026-05-12 ✅ 2/3
49
+ 商品下单 browser - -(未执行)
50
+ 支付接口 api 2026-05-10 ❌ 1/2
51
+
52
+ 共 3 个模块
53
+
54
+ /uat:run <module> 执行测试
55
+ /uat:new 创建新测试模块
56
+ ```
57
+
58
+ 若 `docs/uat/flows/` 不存在或为空:
59
+
60
+ ```
61
+ 暂无测试流程文档
62
+
63
+ 使用 /uat:new 创建第一个测试模块
64
+ ```
@@ -0,0 +1,299 @@
1
+ ---
2
+ name: uat-executor
3
+ description: |
4
+ UAT 测试执行引导。在 /uat:run 命令时激活。
5
+ 读取自然语言测试流程文档,理解每步操作意图,
6
+ 根据当前环境选择最合适的工具和元素定位方式执行。
7
+ 不依赖选择器前置,testid/aria-label 为可选加速提示。
8
+ ---
9
+
10
+ # UAT 执行引导
11
+
12
+ 仅在 `/uat:run` 命令执行时激活。
13
+
14
+ **核心原则**:读懂步骤的**意图**,自行决定用什么工具、怎么找到元素,不依赖 flow 文档预先写好的选择器。
15
+
16
+ ---
17
+
18
+ ## 一、执行前准备
19
+
20
+ ### 1. 读取 flow 文档
21
+
22
+ ```
23
+ docs/uat/flows/<module>.md
24
+ ```
25
+
26
+ 解析以下字段:
27
+ - `平台`:影响工具选择和元素定位方式
28
+ - `入口`:初始 URL 或路径
29
+ - `测试数据`:全局复用数据,执行时按字段名注入
30
+ - `已知结论`:跳过列表,对应场景标记 SKIP
31
+ - 所有 `S0N` 场景:步骤意图 + 预期结果
32
+
33
+ ### 2. 执行环境感知
34
+
35
+ 启动前检测当前可用工具,**不要求 flow 文档预先指定**:
36
+
37
+ | 可用工具 | 优先用于 |
38
+ |---------|---------|
39
+ | `browser:browser` skill | web / mobile-web 平台,DOM 操作 |
40
+ | 截图 + 视觉分析 | 任意平台的验证步骤(判断"显示正确") |
41
+ | Bash | CLI 工具、脚本、文件检查 |
42
+ | 无工具 | 提示用户手动操作,Claude 旁观记录 |
43
+
44
+ 若 `平台=web` 但无 browser 工具:
45
+ ```
46
+ ⚠️ 当前环境无浏览器工具,无法自动执行 web 测试
47
+ 💡 请在 Codex Chrome 或 Claude 桌面客户端运行 /uat:run
48
+ 或将平台改为 desktop,手动操作后由 Claude 验证截图
49
+ ```
50
+
51
+ ---
52
+
53
+ ## 二、逐场景执行
54
+
55
+ ### 执行前:处理已知结论
56
+
57
+ 读取 `已知结论` 区块,命中场景直接标记 **SKIP**:
58
+
59
+ ```
60
+ ⏭ S02 <场景名> — SKIP(已知结论:手工新增接口返回 500)
61
+ ```
62
+
63
+ ### 执行前:注入 console error 监听(web 平台)
64
+
65
+ 在打开页面后、执行任何步骤前,通过 browser 工具注入以下脚本,收集整个场景过程中的 console error:
66
+
67
+ ```javascript
68
+ window.__uatConsoleErrors = [];
69
+ const _orig = console.error.bind(console);
70
+ console.error = function(...args) {
71
+ window.__uatConsoleErrors.push(args.map(String).join(' '));
72
+ _orig(...args);
73
+ };
74
+ ```
75
+
76
+ 每个场景结束后读取并清空 `window.__uatConsoleErrors`,作为该场景的附加信息。
77
+
78
+ ### 对每个场景 `S0N`,按以下流程执行:
79
+
80
+ ```
81
+ 1. 输出场景标题:▶ S01 <场景名称>
82
+ 2. 注入 console error 监听(web 平台,见上方)
83
+ 3. 数据准备:若有说明,提示用户手动准备后确认继续
84
+ 4. 检查前置条件
85
+ 5. 逐步理解并执行操作步骤(见三、意图驱动执行)
86
+ 6. 逐条验证预期结果(见六、断言策略)
87
+ 7. 读取 window.__uatConsoleErrors,记录本场景的 console error 列表
88
+ 8. 数据清理:若场景类型为「新增」,执行清理(见五)
89
+ 9. 记录结果(见下方结果判定规则)
90
+ ```
91
+
92
+ ### console error 结果判定
93
+
94
+ | 步骤结果 | console error | 最终标记 | 说明 |
95
+ |---------|--------------|---------|------|
96
+ | PASS | 无 | ✅ PASS | 正常 |
97
+ | PASS | 有 | ⚠️ PASS | 功能通过但有异常,需关注 |
98
+ | FAIL | 无 | ❌ FAIL | 步骤/断言失败 |
99
+ | FAIL | 有 | ❌ FAIL | 同上,console error 作为附加线索 |
100
+
101
+ ⚠️ PASS 不算失败,不触发截图,但会写入报告和工单。
102
+
103
+ ---
104
+
105
+ ## 三、意图驱动执行
106
+
107
+ **步骤解析原则**:从自然语言步骤中提取三要素——操作类型、目标元素、目标值,再决定执行方式。
108
+
109
+ ### 操作类型映射
110
+
111
+ | 步骤关键词 | 操作类型 | 执行方式 |
112
+ |-----------|---------|---------|
113
+ | 输入、填写、写入 | 文字输入 | 找到输入框 → 清空 → 输入 |
114
+ | 点击、按下、选择 | 点击 | 找到目标元素 → 点击 |
115
+ | 选择(下拉/级联) | 下拉选择 | 见下方浮层规则 |
116
+ | 确认、检查、验证 | 断言 | 见六、断言策略 |
117
+ | 等待、直到 | 等待 | 等指定条件成立 |
118
+
119
+ ### 元素定位优先级
120
+
121
+ 从步骤描述中提取定位线索,按优先级依次尝试:
122
+
123
+ 1. **testid 提示**:步骤中若有 `(testid: xxx)` → 直接用 `[data-testid="xxx"]`
124
+ 2. **语义角色**:按钮、输入框、表格、弹窗等角色 + 步骤中的文字描述
125
+ - 「保存按钮」→ 查找包含「保存」文字的 button 元素
126
+ - 「客户名称输入框」→ 查找 label 含「客户名称」的 input
127
+ 3. **aria-label / placeholder**:无障碍属性中含目标文字
128
+ 4. **上下文位置**:「列表中第一行的删除按钮」→ 定位到列表容器,取第一行,找删除操作
129
+ 5. **视觉截图兜底**:以上都找不到 → 截图发给 Claude 分析,识别目标元素位置
130
+
131
+ **不要一开始就抓全页 DOM**。先用语义线索缩小范围,再精确定位。
132
+
133
+ ### 下拉 / 级联选择处理
134
+
135
+ 步骤写「在省市区选择框选择「广东省 → 广州市 → 天河区」」时,自动拆解为:
136
+
137
+ ```
138
+ 1. 找到省市区选择框(触发器),点击打开
139
+ 2. 等待选项列表出现(在 body 全局查找浮层,框架无关)
140
+ 3. 点击「广东省」,等待下一级列表加载
141
+ 4. 点击「广州市」,等待下一级列表加载
142
+ 5. 点击「天河区」,等待选择框显示值更新
143
+ ```
144
+
145
+ **定位起点:先找字段,不找选项文本**
146
+ 始终先定位字段对应的输入框/触发器(按字段标签名),再操作。不要从页面全局搜索选项文本(如"专业运动"),因为同名文本可能出现在表格、标题、历史数据中。
147
+
148
+ **浮层查找原则**:不在当前容器内查找,在 `body` 全局查找新出现的浮层元素(按组件库特征或新增 DOM 节点检测)。打开下拉后**只看新出现的浮层区域**,不再扫全页。
149
+
150
+ **同名选项消歧**:若页面多处出现同名文字(如"专业运动"),真正要点的是**当前展开下拉菜单内**的那个。用"最近打开的浮层"限定范围,不要从全局 DOM 找第一个匹配。
151
+
152
+ **优先键盘筛选**:下拉打开后,先尝试**直接输入选项名**等待列表过滤,再按回车或点击首个匹配项——比在长列表中滚动翻找更快。级联也可逐级尝试,但需确认组件支持。
153
+
154
+ **避免 Esc 关闭下拉**:关闭浮层通过点击下一个字段或点击下拉外侧。Esc 在弹窗中可能关闭整个弹窗,造成意外中断。
155
+
156
+ **页面记忆:字段顺序固定后不重新探索**
157
+ 第一次确认同一表单的字段顺序(如省市区、销售渠道、客户类型)后,后续用"第几个可见下拉"或"字段标签附近的控件"直接操作,不再每次重新扫描全页。
158
+
159
+ **未命中重试**:点击选项后若选择框值未更新,等 300ms 后重试,最多 2 次,超过记为 ❌ FAIL。
160
+
161
+ ---
162
+
163
+ ## 四、等待策略
164
+
165
+ 不使用固定 sleep。根据步骤意图自动选择等待信号:
166
+
167
+ | 操作后等什么 | 等待方式 | 超时 |
168
+ |------------|---------|-----|
169
+ | 点击提交后 | 等成功提示文字出现 或 URL 变化 或 弹窗关闭 | 10s |
170
+ | 点击下拉触发器 | 等浮层出现(新 DOM 节点) | 5s |
171
+ | 切换页面/路由 | 等 URL 变化 + 目标元素出现 | 10s |
172
+ | 加载中 | 等 loading 指示消失 | 15s |
173
+ | 无明确信号 | 等网络空闲(200ms 内无新请求) | 5s |
174
+
175
+ ---
176
+
177
+ ## 五、测试数据清理
178
+
179
+ **判断场景类型**:标题或步骤含「新增 / 创建 / 添加 / 导入」→ 新增场景,需清理;含「编辑 / 修改 / 更新」→ 不清理。
180
+
181
+ **清理方式**:读取 flow 文档的 `数据清理` 字段,按其描述操作:
182
+ - 若写了 testid 提示 → 按 testid 定位删除按钮
183
+ - 若写的是意图描述(如"找到「测试客户」这条记录,点击删除")→ 按意图执行
184
+ - 找不到目标 → 记录 `⚠️ 数据未清理,请手动删除`,不阻断报告
185
+
186
+ ---
187
+
188
+ ## 六、断言策略
189
+
190
+ 按预期结果的描述判断类型,自动选择验证方式:
191
+
192
+ | 预期结果描述 | 验证方式 |
193
+ |------------|---------|
194
+ | 「XX 文字出现」/ 「显示 XX」 | 在页面中搜索目标文字 |
195
+ | 「列表包含 XX 记录」 | 在列表容器中查找含目标文字的行 |
196
+ | 「提示消失」/ 「弹窗关闭」 | 确认对应元素不在 DOM 中 |
197
+ | 「跳转到 XX 页面」/ 「URL 为 XX」 | 检查当前 URL |
198
+ | 「XX 不显示」/ 「不应存在」 | 确认目标元素不存在 |
199
+ | 截图肉眼判断(视觉一致性) | 截图发 Claude 分析 |
200
+
201
+ **截图策略**:**仅在步骤失败时截图**,通过步骤不截图。路径:`docs/uat/screenshots/YYYY-MM-DD-S0N-<step>.png`
202
+
203
+ ---
204
+
205
+ ## 七、表单边界 & 字符类型测试
206
+
207
+ 场景含「边界」或「字符」关键词,或有 `测试矩阵` 表格时,逐行执行:
208
+
209
+ ```
210
+ 对每一行(B1-B3 边界、C1-C7 字符):
211
+ 1. 找到目标字段(按字段清单中的名称定位)
212
+ 2. 清空字段(全选删除)
213
+ 3. 输入当前行的测试值
214
+ 4. 点击提交,等待页面反馈
215
+ 5. 对比实际结果与预期列:
216
+ - 边界行(B*):预期出现内联错误提示,不提交
217
+ - 字符行(C*):合法字符保存后展示不乱码、不执行脚本
218
+ 6. 任一行不符合预期 → 记为 ❌ FAIL,截图,附行编号和实际结果
219
+ ```
220
+
221
+ **XSS 补充验证**:C4 保存成功后,重新加载详情/列表页,确认字段展示为纯文本而非执行脚本。
222
+
223
+ ---
224
+
225
+ ## 八、执行中更新流程文档
226
+
227
+ 执行过程中,若发现实际行为与 flow 文档描述不符(步骤顺序、提示文本、字段名等),直接更新 `docs/uat/flows/<module>.md` 对应内容,不需要询问,继续执行后续场景。
228
+
229
+ ---
230
+
231
+ ## 九、结果输出格式
232
+
233
+ ### 终端汇总
234
+
235
+ ```
236
+ ═══════════════════════════════════
237
+ UAT 执行报告:<module>
238
+ 执行时间:YYYY-MM-DD HH:mm
239
+ ═══════════════════════════════════
240
+ ✅ S01 正常登录 PASS
241
+ ❌ S02 密码错误提示 FAIL 表单未显示错误信息
242
+ ⚠️ S03 新增客户 PASS 1 个 console error
243
+ ⏭ S04 手工新增 SKIP 已知结论:接口 500
244
+ ───────────────────────────────────
245
+ 通过:2 警告:1 失败:1 跳过:1 共 4
246
+ ═══════════════════════════════════
247
+ ```
248
+
249
+ ### 报告文件格式
250
+
251
+ 写入 `docs/uat/reports/YYYY-MM-DD-<module>.md`:
252
+
253
+ ```markdown
254
+ # UAT 报告:<module>
255
+
256
+ 执行时间:YYYY-MM-DD HH:mm
257
+ 平台:web
258
+
259
+ ## 汇总
260
+
261
+ | 场景 | 名称 | 结果 | Console Errors | 备注 |
262
+ |------|------|------|---------------|------|
263
+ | S01 | 正常登录 | ✅ PASS | - | - |
264
+ | S02 | 密码错误提示 | ❌ FAIL | - | 表单未显示错误信息 |
265
+ | S03 | 新增客户 | ⚠️ PASS | 1 个 | 见详情 |
266
+ | S04 | 手工新增 | ⏭ SKIP | - | 已知结论:接口 500 |
267
+
268
+ 通过:2 · 警告:1 · 失败:1 · 跳过:1
269
+
270
+ ## 失败详情
271
+
272
+ ### S02 密码错误提示
273
+ - **失败步骤**:步骤 3 - 点击登录后
274
+ - **预期**:页面显示「密码错误」提示
275
+ - **实际**:页面无任何提示,直接刷新
276
+ - **截图**:docs/uat/screenshots/2026-05-12-S02-step3.png
277
+
278
+ ## Console Error 详情
279
+
280
+ ### S03 新增客户
281
+ ```
282
+ TypeError: Cannot read properties of undefined (reading 'id')
283
+ at CustomerForm.vue:142
284
+ ```
285
+ ```
286
+
287
+ 更新 flow 文档元信息的 `最后执行` 字段为当前日期。
288
+
289
+ ### 有发现项时的「发现记录」节(见八)
290
+
291
+ 若有执行中发现项,在报告末尾写入「发现记录」表格。
292
+
293
+ ### 有 FAIL 时的后续提示
294
+
295
+ ```
296
+ ⚠️ 发现 <N> 个失败场景
297
+
298
+ 💡 执行 /uat:bug 上报工单(自动创建 issue + 上传截图附件)
299
+ ```