执行测试用例(run-testcase)¶
目标:在运行中的 OBPM/MyApps 上,按 testcase 或测试需求描述,用 Playwright MCP(user-playwright) 直接操作页面执行测试,结果写入 {workspace}/{App}.application/test-results/。
本技能**只执行测试并写报告**,不生成/改写业务 XML,不修改用例 Markdown 正文。
模板:USER.template.md、result-template.md。
UI 约定:playwright-guide.md。
结果目录约定: {App} 取目标软件目录名(不含后缀),例如 iso-mgmt.application →
{workspace}/iso-mgmt.application/test-results/{yyyyMMdd-HHmmss}/。
{App} 优先来自用例/overview 的软件 name、其次 USER.md 身份的「应用」字段、再否则扫描到的 *.application 目录名(歧义则询问)。
硬规则:禁止 catalog / OBPMTest 注入¶
**已废弃、禁止使用**下列机制(勿再调用、勿再写入报告依赖):
scripts/build_obpm_catalog.py/ 任何catalog.jsonscripts/inject-obpm-dom.js/window.OBPMTest/loadCatalog- 以资源 id 解析字段/菜单的 catalog→DOM 链路
唯一执行手段:Playwright MCP 的页面快照 + 可见文案/title/角色定位(见「Playwright 简单处理」与 playwright-guide.md)。
何时触发¶
- 用户要执行测试 / 跑用例 / 自动化验收 / 按场景执行测试
- 提供 testcase 文件路径、用例编号,或测试需求描述
writing-testcase产出用例后要求自动执行
输入¶
| 来源 | 规则 |
|---|---|
| testcase 文档 | 读取 00-overview.md、场景-*.md 或用例编号;步骤与预期对齐文档 |
| 测试需求描述 | 无现成用例时可直接执行;须先走清单门禁 |
{workspace}/USER.md |
多身份账号;用例「角色/账号」优先按 id 匹配,其次角色/显示名;歧义时询问 |
| HOST | 默认 http://localhost:8888;执行前询问是否修改 |
前置检查¶
执行任何浏览器操作前,必须依次完成:
- Playwright MCP(
user-playwright)可用 - 询问 HOST:默认
http://localhost:8888,是否改为其它 {workspace}/USER.md:存在且至少一个完整身份;否则按 USER.template.md 询问并写入/编辑
每个身份必填字段:显示名 / 用户名 / 密码 / 角色 / 部门 / 应用 / 备注(id 为###标题,如applicant)- 确定执行清单(见「选例」)
- 询问失败策略(见「失败策略」)
硬门禁:未完成以上五项前,禁止任何浏览器操作。
逐项询问(硬规则)¶
需用户确认的问题**必须一个一个问**,禁止在同一条回复里并列多个待确认项。
| 顺序 | 问题 | 何时问 |
|---|---|---|
| 1 | HOST(默认 http://localhost:8888) |
Playwright 可用后立刻问;本轮只问 HOST |
| 2 | USER.md 补全/歧义(若需要) | HOST 确认后;字段齐全且无歧义则跳过,不发问 |
| 3 | 执行清单(选例门禁) | 上一步完成后;仅当清单尚未由用户明确指定时 |
| 4 | 失败策略(默认失败继续) | 清单确定后;本轮只问失败策略 |
提问格式(编号选项)¶
凡需用户做选择的问题,**必须**以编号选项列出,请用户回复数字(可多选时写清规则,如 1 或 2,3)。
规则:
- 一问一答:每条 Agent 回复最多提出 一个 需用户回答的问题,然后停止等待
- 编号选项:可选项一律
1.2.3.…;默认项写在对应选项旁 - 用户回复数字:采纳对应选项;回复原文(URL、用例编号)也有效
- 不得打包:禁止把 HOST / 清单 / 失败策略合成一次多问题确认
- 可附带只读信息:清单摘要可放在选项之前,本轮只收对「请选择」的答复
- 用户已在一句里答多项:可一并采纳并跳过已答项
- 可跳过:该步已明确则不问
各门禁示例选项¶
HOST:
执行清单(场景级,示例):
请选择本次执行范围:
1. 全部已纳入 P0(N 条)(默认)
2. 冒烟子集(说明包含哪些)
3. 按场景多选(回复 3 并附场景编号,如 3: 1,2,4)
4. 自定义(回复 4 并写出场景名或 TC 编号)
请回复选项编号。
失败策略:
选例(混合)¶
| 输入 | 行为 |
|---|---|
| 明确文件/编号/「全部 P0」等可执行集合 | 生成清单后**仍须**单独确认失败策略(若尚未确认),再执行 |
| 笼统需求 / 仅 overview / 场景未勾选 | HOST/USER 就绪后,单独出编号选项清单 → 等用户回复编号 → 再单独问失败策略 |
清单应包含:用例编号、标题、优先级、所需身份。
失败策略¶
清单确定后**单独询问一次**:
- 失败继续(默认)— 记录 FAIL,继续后续用例
- 遇失败即停 — 当前用例失败后中止套件
未明确回答时采用默认「失败继续」,但仍须按编号选项询问一次。用户答完后才可开始浏览器操作。
工作流¶
确认 Playwright MCP
→ 【停】只问 HOST → 等用户答
→ 检查 USER.md(缺则【停】问补全;否则跳过)
→ 若清单未明确:【停】确认执行清单 → 等用户答
→ 【停】只问失败策略 → 等用户答
→ 创建 {App}.application/test-results/{yyyyMMdd-HHmmss}/ + screenshots/
→ browser_navigate 登录页 → 填账号密码 → 点登录
→ 等待 portal 就绪 → 点顶栏目标应用(按显示名/title)
→ 逐条用例:snapshot → 侧栏菜单进功能 → 操作视图/表单 → 断言文案/toast → 截图
→【硬】本条结束(PASS/FAIL/SKIP)后关闭本条打开的页签(见「页签清理」)
→ 写 summary.md(用例 >5 可拆 TC-*.md)→ browser_close → 对话汇报
**禁止**在工作流中插入 build catalog、注入脚本、loadCatalog 步骤。
页签清理(硬规则)¶
每条用例执行完毕后(无论 PASS / FAIL / SKIP),**必须**关闭本条打开的业务页签,再进入下一条或收尾。
- 优先:点击可见文案「关闭所有」(若存在且可点)
- 否则:在
.main-tab内逐个关闭本条打开的页签(关闭图标 / 页签上的 ×) - 关闭前先闭环残留弹层(见「弹层闭环」),避免挡关闭
- 下一条开始前:无多余业务页签(首页/门户可保留);禁止带着上一单表单页签继续点菜单
- 套件全部结束后仍须再关一次残留页签,再
browser_close
收尾:关闭浏览器(硬规则)¶
本轮执行清单全部处理完毕后(含全部跑完、遇失败即停、或用户中断后已写完 summary),必须先完成页签清理,再 browser_close,然后对话汇报。
- 页签清理(「关闭所有」或关净
.main-tab业务页签) - 调用 Playwright MCP:
browser_close - 必要时
browser_tabs确认无残留业务页 - 时机:
summary.md已落盘之后、对话汇报之前 - 例外:用户明确要求「保持浏览器打开」时可跳过关浏览器,并在 summary 备注写明;页签清理仍建议执行
中途「人工协助」暂停时**不要**关浏览器。
环境 URL¶
| 用途 | URL |
|---|---|
| 默认 HOST | http://localhost:8888 |
| 登录页 | {HOST}/static/signon/index.html |
| 主界面(portal) | {HOST}/static/portal/vue/index.html |
Playwright 简单处理(主路径)¶
优先使用 MCP 工具(参数以当前工具 schema 为准,常见为 target 而非旧版 ref):
| 意图 | 做法 |
|---|---|
| 打开页 | browser_navigate |
| 看控件 | browser_snapshot,用返回的 ref/target 与可见名称操作 |
| 点击 | browser_click:按钮用 title/可见文本;菜单/页签必须带父容器(见下) |
| 填表 | browser_fill_form / browser_type:登录框、表单输入 |
| 断言 | snapshot / browser_evaluate 读 document.body.innerText 或 toast 文案是否包含期望 |
| 截图 | browser_take_screenshot 落到本轮 screenshots/ |
| 复杂串联 | browser_run_code_unsafe 用 Playwright 定位;菜单/页签见父容器硬规则;禁止 OBPMTest |
身份切换¶
- 从
USER.md解析角色对应账号 - 切换:退出 → 打开登录页 → 新身份登录(**无需**重新注入任何脚本)
- 同一身份连续用例可复用会话
步骤执行¶
- 将用例「操作步骤」映射为:点菜单 → 点视图工具栏 → 填字段 → 点保存/流程按钮 → 看列表/toast
- 将「预期结果」映射为:页面可见文案、列表行、toast(如「保存 成功」「保存并返回 成功」)
- 每步记录 OK/FAIL;失败步骤必须截图;关键断言通过时建议截图
菜单与应用(OBPM portal 约定)¶
- 顶栏点开目标软件(显示名可能截断,用 title 或含关键字的 link,如「ISO」)
- 侧栏**一级分类**先点开(如「元数据配置」),再点**叶子**(如「文档分类」)
- 不要假设「只点叶子」一定展开;snapshot 确认叶子可见再点
- 菜单展示名默认中文(与 generate-menu 约定一致)
- 父容器硬规则(防同名冲突):
- 菜单:必须在父元素
class="main-navbar"内定位(例:page.locator('.main-navbar').getByTitle('文档分类')) - 页签:必须在父元素
class="main-tab"内定位(例:page.locator('.main-tab').getByTitle('文档分类')) - 禁止全页裸
getByTitle点菜单或页签(会同时命中侧栏与页签) - 禁止用查询栏定位/打开菜单(硬):
- **不得**通过 portal 顶栏/全局「查询」「搜索」「菜单搜索」输入框输入菜单名再点结果进功能
- **不得**用工作台搜索、快捷入口搜索冒充侧栏菜单导航
- 唯一菜单路径:
.main-navbar内一级展开 → 点中文叶子(title / 可见文案) - 叶子不可见时:先点开一级分类再点;仍失败 →「人工协助」,**禁止**改走查询栏绕过
视图 / 表单¶
| 操作 | 简单做法 |
|---|---|
| 新建 | 视图工具栏可见文本「新建」 |
| 删除 / 导入 Excel | 同理按可见文本 |
| 填字段 | 优先:标签文案旁输入框、placeholder;其次 snapshot 中 textbox 顺序;可用 getByLabel(若无障碍树则用邻近文本) |
| 保存 | [title="保存"] / [title="保存并返回"] 或按钮可见文本 |
| 列表核对 | 回到列表页签或再点叶子菜单;innerText 含编码/名称 |
保存后重开回显(硬规则)¶
用例要求「关闭后再打开同一单据核对」时:
| 步骤 | 正确做法 |
|---|---|
| 保存 | 点「保存」或「保存并返回」;以 toast 成功为准 |
| 记录线索 | 列表中的业务键(如文件编号、分类编码)或页签标题;可选从页面读取 docid(#dy_refreshObj)仅作备注 |
| 关闭 | 「关闭所有」或关闭当前主页签 |
| 重开 | 从列表点该行打开;或查询后打开。**禁止**再次点侧栏同一叶子当「重开」(会 empty 新建,字段为空) |
| 回显前 | snapshot / 等待表单区域出现目标标签或输入值后再断言 |
弹层闭环(硬规则)¶
打开选择器/确认框后,离开该步骤前必须关闭(确认或取消),禁止残留 .el-dialog / drawer 挡下一步。
- 开则必关;下一步前 snapshot 确认无遮挡
- 视图/用户/部门选择必须真实选中再确认,禁止只改旁路文本冒充 PASS
- 用例开始前/结束后清理残留弹层;关不掉则本条 FAIL
- 关键截图在弹层关闭、主界面可见后拍摄
硬门禁(执行期)¶
- 未确认 HOST、USER.md 未就绪、执行清单未确定:**禁止**开始浏览器操作
- **禁止**注入
OBPMTest或加载catalog.json - **禁止**用查询栏/菜单搜索代替侧栏
.main-navbar导航 - 选择器不确定:按「人工协助」暂停,禁止硬猜冒充通过
- **弹层未闭环前禁止**进入下一步/下一条用例
- **本条未完成页签清理前禁止**进入下一条用例(遇失败即停时也须先关页签再写报告/收尾)
人工协助¶
选择器不确定或控件点不到时:
- 说明卡点:哪一步、当前 URL、snapshot 摘要
- 请用户提供 DevTools 片段,或先点到目标页再继续
- 将稳定定位方式记入本轮
summary.md备注,并酌情回写 playwright-guide.md - 禁止硬猜通过
报告¶
按 result-template.md 写入 {workspace}/{App}.application/test-results/{runId}/。
{workspace}/{App}.application/test-results/{yyyyMMdd-HHmmss}/
├── summary.md
├── TC-{编号}.md # 用例 >5 条时建议
└── screenshots/
└── {用例编号}-step{序号}-{简述}.png
**不要**再生成或保存 catalog.json。
summary.md 必含¶
- HOST、runId、开始/结束时间
- 失败策略、使用的身份列表
- 输入来源
- 结果表:编号、标题、结果(PASS/FAIL/SKIP)、身份、截图、失败摘要
- 统计:PASS / FAIL / SKIP / 合计
- 备注:环境/数据问题;Playwright 定位校准(无则写「无」)
写完 summary.md 后 browser_close,再汇报。
不修改 testcase/ 下用例正文。
与 writing-testcase¶
writing-testcase → testcase/00-overview.md + 场景-*.md
↓
run-testcase(Playwright MCP)
↓
{App}.application/test-results/{runId}/summary.md
不做¶
- 生成/改写业务 XML
- 修改用例 Markdown 正文
- 使用 catalog.json / inject-obpm-dom / OBPMTest
- 在技能仓库存放真实密码(只在 workspace
USER.md) - 设计器拖拽、报表像素断言、移动端 H5 全量、第三方 iframe 深页(首版范围外)
- 替代缺陷管理系统