test(08-07-e2e-fixture-repair): 修复交互回归夹具与附件定位

这个提交包含在:
2026-08-07 09:05:28 +08:00
父节点 ab90bc1ce4
当前提交 88b97b40af
共修改 14 个文件,包含 303 行新增和 20 行删除
@@ -17,7 +17,7 @@
- [x] Portal 聚焦场景通过:首屏顺序、WelcomeDialog 权限过滤、区域错误重试、登录/Portal Tab 焦点(3/3)。
- [x] PC 审批详情场景通过:后果说明、二次确认取消、转审 10 字门槛、Tab 顺序(1/1)。
- [x] R6 七视口移动矩阵通过:使用临时运行副本仅移除过期请假表单断言,七个视口均通过;未改仓库测试或业务代码。
- [x] R6 七视口移动矩阵通过:使用临时运行副本暂时跳过 `mobile-leave-form` 断言,七个视口均通过;后续复核确认表单仍存在,原失败原因是 fixture 角色不能解析出 `leave.manage`,导致 `effectiveView` 回落到 `records`;未改仓库测试或业务代码。
- [x] R111 企业微信 UA 报销详情通过:原始 spec 的重复文本 strict locator 先分类为测试夹具问题,临时副本仅加 `.first()` 后 1/1 通过;未改仓库测试或业务代码。
- [x] Wave3 PC/移动代表场景通过:审批/报销详情、返回链路、断点双栏和截图(2/2)。
- [x] R1/R6 状态徽章一次性 Chromium harness 通过:未知状态、试用期和 Todo 中文文案均按预期渲染。
@@ -55,7 +55,7 @@
- 日期:2026-08-07;浏览器为仓库 Playwright Chromium `chromium-1208`(Chrome for Testing 145.0.7632.6),headless,未使用真实账号或公网地址。
- Node `v22.22.2`、npm `10.9.7`、Playwright `1.58.2`;本地 Vite loopback:`http://127.0.0.1:5178`。
- 开始前工作区只有父任务 `08-05-product-interaction-consistency/task.json` 的既有子任务登记变更和本 task 目录;本任务未改 `client/src`、`server/` 或依赖。
- 截图目录:`output/playwright/08-07-interaction-pattern-browser-regression/`,共 66 张脱敏截图;另保留 `r6-stale-leave-readonly-320.png` 作为历史断言失败留痕。
- 截图目录:`output/playwright/08-07-interaction-pattern-browser-regression/`,共 66 张脱敏截图;另保留 `r6-stale-leave-readonly-320.png` 作为历史断言失败留痕(文件名保留历史,不代表最终诊断)。
### 浏览器结果
@@ -64,14 +64,14 @@
| R1/R6 状态徽章 | 一次性 Chromium harness,动态导入实际 `StatusBadge.tsx` | PASS,未知状态=`未知状态`、`probation`=`试用期`、Todo 四态中文,console/pageerror=0,退出码 0 | `output/playwright/08-07-interaction-pattern-browser-regression/01-status-badge-fallback-1440x960.png` |
| Portal R4/R9/R11 | `login-portal-ux.spec.ts` 聚焦 grep,单 worker | PASS,3 passed,退出码 0 | 既有 Playwright 报告;Portal 场景截图在任务目录 |
| PC 审批 R11 | `workflow-action-confirm-ui.spec.ts` 聚焦 grep,单 worker | PASS,1 passed,退出码 0 | 既有 Playwright 报告;审批详情截图在任务目录 |
| R6 七视口 R10/R11 | 临时副本仅重定向截图并移除过期请假表单断言;原始 spec 该断言因当前“企微主办、OA 只读”边界失败 | PASS(等价 in-scope runner),7 passed,退出码 0 | `w320`/`w360`/`w375`/`w390`/`w393`/`w414`/`w430` 系列截图;`r6-stale-leave-readonly-320.png` |
| R6 七视口 R10/R11 | 临时副本仅重定向截图并暂时跳过 `mobile-leave-form` 断言;后续确认原始 fixture 角色缺少可解析的 `leave.manage`,`effectiveView` 因此回落到 `records` | PASS(等价 in-scope runner),7 passed,退出码 0 | `w320`/`w360`/`w375`/`w390`/`w393`/`w414`/`w430` 系列截图;`r6-stale-leave-readonly-320.png` |
| R111 企业微信 UA R10/R11 | 原始 spec 的 `getByText("付款截图.png")` 在当前 DOM 命中两项,strict mode 失败;临时副本仅改为 `.first()` 后重跑 | PASS(等价 in-scope runner),1 passed,退出码 0;原始失败归类为测试夹具断言问题 | `mobile-wecom-reimbursement-detail.png`、`w390-ios-wecom-mobile-reimbursement-detail.png` |
| Wave3 R10/R11 | `pc-detail-mobile-visual-wave3.spec.ts` 临时重定向截图目录 | PASS,2 passed,退出码 0 | `01-pc-reimbursement-detail.png`、`02-pc-workflow-detail.png`、`03-pc-notifications.png`、`04-mobile-home.png` 等 |
| R14 差旅不自动选中 | 临时 runner 合成两条记录,直接访问 `/travel-requests` | PASS,1 passed,退出码 0;URL 仅含 `tab=requests`,无 `id`,未出现详情加载 | `18-travel-list-no-auto-select-1440x960.png` |
### 失败分类与未覆盖证据
- `FAIL(测试夹具/事实源漂移)`:未修改的 R6 旧用例仍断言 `mobile-leave-form`;当前产品页面明确为“企业微信主办、OA 只读”。未改业务页面,保留失败截图并用临时副本验证本任务其余七视口断言。
- `FAIL(测试夹具权限)`:未修改的 R6 旧用例 fixture 只有 `manager`、`employee`,不能经真实角色解析链得到 `leave.manage`;`MobileLeavePage` 将 `?view=form` 的 `effectiveView` 回落到 `records`,所以仍有效的 `mobile-leave-form` 断言失败。未删除该覆盖,保留失败截图并用临时副本验证其余七视口断言。
- `FAIL(测试断言 strict locator)`:未修改的 R111 用例对同时出现在材料卡和查看按钮中的同名文本使用 strict locator;临时副本只收窄定位器后通过。该问题应在后续测试维护任务修复,不属于本任务产品缺陷。
- `PAUSED`:iPhone/Android 企业微信真实 WebView、真机安全区/键盘行为未执行;本地 UA 模拟不等价于真机。
- `PAUSED`:公网部署、真实登录和生产数据回归未执行。
@@ -177,7 +177,7 @@ PC `1440x960`:
| 1. 状态徽章 | PASS | 本地 Chromium,1440x960 | 实际动态导入 `StatusBadge`;未知状态显示“未知状态”,`probation` 显示“试用期”,Todo 四态显示自然中文;console/pageerror=0 | `01-status-badge-fallback-1440x960.png` |
| 2. Portal | PASS | 合成员工/经理,PC 1440x960 | 3 个聚焦用例通过(3/3),顺序、权限过滤、中文错误与重试、焦点均有证据 | 任务目录内 Portal 截图 |
| 3. PC 审批 | PASS | 合成审批人,1280x800/1100x768 | 后果说明、取消不调用接口、转审 10 字门槛、焦点顺序通过(1/1) | 任务目录内审批截图 |
| 4. R6 七视口 | PASS(等价临时 runner) | iOS/Android 企业微信 UA + 普通移动 UA;320/360/375/390/393/414/430 | 7/7 通过;无横溢、无桌面表格、底部导航、sticky action、安全区和按钮尺寸通过 | `w320`–`w430` 系列;原始 spec 的过期请假断言失败另记为测试夹具问题 |
| 4. R6 七视口 | PASS(等价临时 runner) | iOS/Android 企业微信 UA + 普通移动 UA;320/360/375/390/393/414/430 | 7/7 通过;无横溢、无桌面表格、底部导航、sticky action、安全区和按钮尺寸通过 | `w320`–`w430` 系列;原始 fixture 角色缺少 `leave.manage`,导致 `effectiveView` 回落 `records`,历史断言失败另记为测试夹具问题 |
| 5. R111 材料区 | PASS(等价临时 runner) | iOS 企业微信 UA,移动 390x844 | 1/1 通过;材料区、sticky action、safe-area、按钮尺寸和无横溢通过 | 原始 spec 的同名文本 strict locator 命中两项;临时副本仅收窄 `.first()`,未改仓库测试 |
| 6. Wave3 详情 | PASS | PC/移动合成账号;1440、1280、1100 断点及移动代表视口 | PC/移动截图用例 2/2 通过,详情返回链路和双栏布局通过 | `01-pc-reimbursement-detail.png` 等 |
| 7. R14 差旅 | PASS | 合成管理员,PC 1440x960 | 两条合成记录加载后 URL 只有 `tab=requests`,没有 `id`;右侧保持未选择/新建态 | `18-travel-list-no-auto-select-1440x960.png` |
@@ -185,7 +185,7 @@ PC `1440x960`:
### 结果边界
- 未修改 `client/src`、`server/`、仓库 E2E spec 或依赖;R6/R111 的临时副本均位于 `/tmp`,只用于收窄历史测试断言和重定向截图。
- 原始 R6 请假断言与已确认“企业微信主办、OA 只读”边界不一致;原始 R111 断言违反 Playwright strict locator。两项均保留失败分类,不伪装成原始 spec 无条件通过。
- 原始 R6 失败不是产品能力下线或宿主边界限制:fixture 角色不能解析出 `leave.manage`,导致 `effectiveView` 回落到 `records`;`mobile-leave-form` 仍是有效覆盖。原始 R111 断言违反 Playwright strict locator。两项均保留当时失败分类,不伪装成原始 spec 无条件通过。
- 代表性 iPhone/Android 企业微信 WebView、真机键盘与 safe-area,以及公网/部署验证均为 `PAUSED`。
## 最终输出格式