修复审批按钮布局测试跨帧测量(09-17-company-loan-principal-repayment)

两个同排按钮在同一次浏览器执行中测量,保留纵坐标严格相等及原高度差断言,不修改报销或资金业务规则。

定向审批浏览器验证 21/21 通过,零重试;任务与治理检查通过。原 7a48a1e7 正式门禁失败记录保留,新候选待重跑完整门禁。

真实建行材料、人员核实与独立业务验收仍待完成;本次仅本地提交,不推送、不部署。
这个提交包含在:
2026-10-08 08:30:38 +08:00
父节点 7a48a1e76f
当前提交 1dd840655b
共修改 2 个文件,包含 22 行新增和 2 行删除
@@ -1,3 +1,15 @@
## 2026-10-08 正式本地发布门禁及测量时序修正
用户同意对固定干净候选 `7a48a1e7` 运行正式本地门禁;执行 `bash scripts/qa/run-release-gate.sh verify-candidate`,未推送、部署、查询生产或执行远端备份切换。专用浏览器经官方安装及受控复制,Chromium/WebKit 原生隔离检查通过。原始回执保留在 `artifacts/release-gate/loan-7a48a1e7-20261008/release-result.json`,结论 **FAIL,不具备发布资格**,不以针对性重验覆盖它。
- static 通过;完整服务端单测 4480 通过、1 项原有跳过,前端类型/构建、审批操作及门禁默认配置的服务端流程通过。`regression-all.sh` 默认关闭的 7 个可选专项没有执行,不计通过。
- 网页完整发现 59 个本地 spec、372 个用例,执行 371 通过、1 失败、0 跳过、0 重试。唯一失败是既有报销审批用例 `workflow-action-confirm-ui.spec.ts:530`:两个同排按钮先后读取纵坐标,相差约 1.16px,严格相等断言失败。原用例及报销页面均不在本轮借款业务改动中。
- 回执确认候选源码/仓库全程未变,隔离数据库容器及运行目录清理通过。仍不替代真实建行材料、人员可用性与外部业务验收。
- 本轮仅修正该用例的测量时序:在同一次浏览器执行中读取两个按钮的位置,保留原有纵坐标严格相等及高度差上限断言;页面仍保留 320ms 入场动画。不修改业务实现、不增加像素容差、不跳过用例。
- [x] 用官方受管 `retained-local` 对整个 `workflow-action-confirm-ui.spec.ts` 定向验证:21/21 通过,0 跳过、0 重试,原报销证据/退回意见断言以及电脑/手机审批场景均执行,环境和自有容器/运行目录清理通过。结果保留在 `artifacts/qa-flow/loan-gate-layout-20261008/`,不作为正式发布回执。
- 定向入口:`QA_FULL_REPORT_DIR=artifacts/qa-flow/loan-gate-layout-20261008 QA_RETAINED_SPECS=workflow-action-confirm-ui.spec.ts bash scripts/qa/run-web-gates.sh retained-local`;执行时另显式指定本次经校验复制的专用浏览器目录和受控 BIFF8 Python,不使用共享历史浏览器缓存。任务校验、治理、流程合同及 `git diff --check` 通过。
- 用户已确认将本次测试修正及任务记录这两个文件本地提交,不推送、不部署。提交后对新的固定干净候选重跑正式完整门禁,结果写入新的本地回执,保留上次失败记录;本记录提交时尚不宣称正式门禁通过。
## 2026-10-07 后续收口执行(用户同意执行) ## 2026-10-07 后续收口执行(用户同意执行)
按后续工作清单,先将已验证的 S4–S8 共 32 项改动本地提交,提交保留“真实回单待验、整体业务验收未通过”。随后补齐提交登记、清单复核、失败归属、晚到补记和追回的浏览器闭环,并准备发布前存量/迁移/回退检查材料。当前 inline 主会话直接实现和检查,不另派代理;此前两名代理的复核仅覆盖其当时差异。用户本轮已明确授权生产借款存量的只读汇总查询;人员与银行材料答复“不清楚”,保持待核实;推送、部署和远端备份切换不在本次默认执行内。以下“32 项未提交”属于提交前验证时点。 按后续工作清单,先将已验证的 S4–S8 共 32 项改动本地提交,提交保留“真实回单待验、整体业务验收未通过”。随后补齐提交登记、清单复核、失败归属、晚到补记和追回的浏览器闭环,并准备发布前存量/迁移/回退检查材料。当前 inline 主会话直接实现和检查,不另派代理;此前两名代理的复核仅覆盖其当时差异。用户本轮已明确授权生产借款存量的只读汇总查询;人员与银行材料答复“不清楚”,保持待核实;推送、部署和远端备份切换不在本次默认执行内。以下“32 项未提交”属于提交前验证时点。
@@ -522,8 +522,16 @@ test.describe("R7E 审批动作二次确认", () => {
await expect(primaryActions.getByRole("button")).toHaveCount(2); await expect(primaryActions.getByRole("button")).toHaveCount(2);
await expect(primaryActions.getByRole("button", { name: "通过" })).toBeVisible(); await expect(primaryActions.getByRole("button", { name: "通过" })).toBeVisible();
await expect(primaryActions.getByRole("button", { name: "退回修改" })).toBeVisible(); await expect(primaryActions.getByRole("button", { name: "退回修改" })).toBeVisible();
const approveBox = await page.getByTestId("workflow-task-approve").boundingBox(); // Read both rectangles in one browser task: page-reveal moves their shared
const returnBox = await page.getByTestId("workflow-task-return-toggle").boundingBox(); // ancestor, so sequential boundingBox calls can observe different frames.
const [approveBox, returnBox] = await primaryActions.evaluate((element) => (
["workflow-task-approve", "workflow-task-return-toggle"].map((testId) => {
const button = element.querySelector(`[data-testid="${testId}"]`);
if (!button) return null;
const { y, height } = button.getBoundingClientRect();
return { y, height };
})
));
expect(approveBox).not.toBeNull(); expect(approveBox).not.toBeNull();
expect(returnBox).not.toBeNull(); expect(returnBox).not.toBeNull();
expect(Math.abs(approveBox!.height - returnBox!.height)).toBeLessThanOrEqual(1); expect(Math.abs(approveBox!.height - returnBox!.height)).toBeLessThanOrEqual(1);