跳转至

执行测试用例(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.json
  • scripts/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;执行前询问是否修改

前置检查

执行任何浏览器操作前,必须依次完成:

  1. Playwright MCP(user-playwright)可用
  2. 询问 HOST:默认 http://localhost:8888,是否改为其它
  3. {workspace}/USER.md:存在且至少一个完整身份;否则按 USER.template.md 询问并写入/编辑
    每个身份必填字段:显示名 / 用户名 / 密码 / 角色 / 部门 / 应用 / 备注(id 为 ### 标题,如 applicant)
  4. 确定执行清单(见「选例」)
  5. 询问失败策略(见「失败策略」)

硬门禁:未完成以上五项前,禁止任何浏览器操作。

逐项询问(硬规则)

需用户确认的问题**必须一个一个问**,禁止在同一条回复里并列多个待确认项。

顺序 问题 何时问
1 HOST(默认 http://localhost:8888) Playwright 可用后立刻问;本轮只问 HOST
2 USER.md 补全/歧义(若需要) HOST 确认后;字段齐全且无歧义则跳过,不发问
3 执行清单(选例门禁) 上一步完成后;仅当清单尚未由用户明确指定时
4 失败策略(默认失败继续) 清单确定后;本轮只问失败策略

提问格式(编号选项)

凡需用户做选择的问题,**必须**以编号选项列出,请用户回复数字(可多选时写清规则,如 1 或 2,3)。

<简短说明,可选>

请选择:
1. <选项 A>(可标注默认)
2. <选项 B>
…
请回复选项编号。

规则:

  • 一问一答:每条 Agent 回复最多提出 一个 需用户回答的问题,然后停止等待
  • 编号选项:可选项一律 1. 2. 3. …;默认项写在对应选项旁
  • 用户回复数字:采纳对应选项;回复原文(URL、用例编号)也有效
  • 不得打包:禁止把 HOST / 清单 / 失败策略合成一次多问题确认
  • 可附带只读信息:清单摘要可放在选项之前,本轮只收对「请选择」的答复
  • 用户已在一句里答多项:可一并采纳并跳过已答项
  • 可跳过:该步已明确则不问

各门禁示例选项

HOST:

请选择 HOST:
1. 使用默认 http://localhost:8888(默认)
2. 使用其它地址(回复 2 并附上 URL)
请回复选项编号。

执行清单(场景级,示例):

请选择本次执行范围:
1. 全部已纳入 P0(N 条)(默认)
2. 冒烟子集(说明包含哪些)
3. 按场景多选(回复 3 并附场景编号,如 3: 1,2,4)
4. 自定义(回复 4 并写出场景名或 TC 编号)
请回复选项编号。

失败策略:

请选择失败策略:
1. 失败继续(默认)— 记录 FAIL,继续后续用例
2. 遇失败即停 — 当前用例失败后中止套件
请回复选项编号。

选例(混合)

输入 行为
明确文件/编号/「全部 P0」等可执行集合 生成清单后**仍须**单独确认失败策略(若尚未确认),再执行
笼统需求 / 仅 overview / 场景未勾选 HOST/USER 就绪后,单独出编号选项清单 → 等用户回复编号 → 再单独问失败策略

清单应包含:用例编号、标题、优先级、所需身份。

失败策略

清单确定后**单独询问一次**:

  1. 失败继续(默认)— 记录 FAIL,继续后续用例
  2. 遇失败即停 — 当前用例失败后中止套件

未明确回答时采用默认「失败继续」,但仍须按编号选项询问一次。用户答完后才可开始浏览器操作。

工作流

确认 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),**必须**关闭本条打开的业务页签,再进入下一条或收尾。

  1. 优先:点击可见文案「关闭所有」(若存在且可点)
  2. 否则:在 .main-tab 内逐个关闭本条打开的页签(关闭图标 / 页签上的 ×)
  3. 关闭前先闭环残留弹层(见「弹层闭环」),避免挡关闭
  4. 下一条开始前:无多余业务页签(首页/门户可保留);禁止带着上一单表单页签继续点菜单
  5. 套件全部结束后仍须再关一次残留页签,再 browser_close

收尾:关闭浏览器(硬规则)

本轮执行清单全部处理完毕后(含全部跑完、遇失败即停、或用户中断后已写完 summary),必须先完成页签清理,再 browser_close,然后对话汇报。

  1. 页签清理(「关闭所有」或关净 .main-tab 业务页签)
  2. 调用 Playwright MCP:browser_close
  3. 必要时 browser_tabs 确认无残留业务页
  4. 时机:summary.md 已落盘之后、对话汇报之前
  5. 例外:用户明确要求「保持浏览器打开」时可跳过关浏览器,并在 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 约定)

  1. 顶栏点开目标软件(显示名可能截断,用 title 或含关键字的 link,如「ISO」)
  2. 侧栏**一级分类**先点开(如「元数据配置」),再点**叶子**(如「文档分类」)
  3. 不要假设「只点叶子」一定展开;snapshot 确认叶子可见再点
  4. 菜单展示名默认中文(与 generate-menu 约定一致)
  5. 父容器硬规则(防同名冲突):
  6. 菜单:必须在父元素 class="main-navbar" 内定位(例:page.locator('.main-navbar').getByTitle('文档分类'))
  7. 页签:必须在父元素 class="main-tab" 内定位(例:page.locator('.main-tab').getByTitle('文档分类'))
  8. 禁止全页裸 getByTitle 点菜单或页签(会同时命中侧栏与页签)
  9. 禁止用查询栏定位/打开菜单(硬):
  10. **不得**通过 portal 顶栏/全局「查询」「搜索」「菜单搜索」输入框输入菜单名再点结果进功能
  11. **不得**用工作台搜索、快捷入口搜索冒充侧栏菜单导航
  12. 唯一菜单路径:.main-navbar 内一级展开 → 点中文叶子(title / 可见文案)
  13. 叶子不可见时:先点开一级分类再点;仍失败 →「人工协助」,**禁止**改走查询栏绕过

视图 / 表单

操作 简单做法
新建 视图工具栏可见文本「新建」
删除 / 导入 Excel 同理按可见文本
填字段 优先:标签文案旁输入框、placeholder;其次 snapshot 中 textbox 顺序;可用 getByLabel(若无障碍树则用邻近文本)
保存 [title="保存"] / [title="保存并返回"] 或按钮可见文本
列表核对 回到列表页签或再点叶子菜单;innerText 含编码/名称

保存后重开回显(硬规则)

用例要求「关闭后再打开同一单据核对」时:

步骤 正确做法
保存 点「保存」或「保存并返回」;以 toast 成功为准
记录线索 列表中的业务键(如文件编号、分类编码)或页签标题;可选从页面读取 docid(#dy_refreshObj)仅作备注
关闭 「关闭所有」或关闭当前主页签
重开 从列表点该行打开;或查询后打开。**禁止**再次点侧栏同一叶子当「重开」(会 empty 新建,字段为空)
回显前 snapshot / 等待表单区域出现目标标签或输入值后再断言

弹层闭环(硬规则)

打开选择器/确认框后,离开该步骤前必须关闭(确认或取消),禁止残留 .el-dialog / drawer 挡下一步。

  1. 开则必关;下一步前 snapshot 确认无遮挡
  2. 视图/用户/部门选择必须真实选中再确认,禁止只改旁路文本冒充 PASS
  3. 用例开始前/结束后清理残留弹层;关不掉则本条 FAIL
  4. 关键截图在弹层关闭、主界面可见后拍摄

硬门禁(执行期)

  • 未确认 HOST、USER.md 未就绪、执行清单未确定:**禁止**开始浏览器操作
  • **禁止**注入 OBPMTest 或加载 catalog.json
  • **禁止**用查询栏/菜单搜索代替侧栏 .main-navbar 导航
  • 选择器不确定:按「人工协助」暂停,禁止硬猜冒充通过
  • **弹层未闭环前禁止**进入下一步/下一条用例
  • **本条未完成页签清理前禁止**进入下一条用例(遇失败即停时也须先关页签再写报告/收尾)

人工协助

选择器不确定或控件点不到时:

  1. 说明卡点:哪一步、当前 URL、snapshot 摘要
  2. 请用户提供 DevTools 片段,或先点到目标页再继续
  3. 将稳定定位方式记入本轮 summary.md 备注,并酌情回写 playwright-guide.md
  4. 禁止硬猜通过

报告

按 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 深页(首版范围外)
  • 替代缺陷管理系统