refactor(pages): PO 层框架化 — 细粒度操作 + 显式等待 + 消除静默吞异常

DriverFreightFlowPage (APP):
- 流程方法拆为单一职责的细粒度操作(open_freight_tab/fill_quantity/upload_photo_from_album/...),
  流程方法仅做编排,公共 API 不变,用例零改动
- 移除全部 implicitly_wait 全局副作用,每步显式等待目标元素
- 容错点击(已知晓/确定)改为 _tap_by_text_if_present,跳过时记录 warning

FreightAccountingPage (Web):
- _go/_click_search 改显式等待(搜索框出现/列表数据行或空态),替代固定 2s/1s sleep
- 表格等待升级为 td:visible,避开 vxe-table 固定列隐藏占位单元格
- 点击行操作按钮后显式等待弹窗出现,替代固定 800ms
- 车队长下拉选择改显式等待下拉项渲染
- 可选弹窗操作统一收敛到 _try_click,跳过时记录 warning;关键确认按钮保持严格

两条 E2E 用例在真实环境回归通过(TC-D2S-001 116s / TC-D2S-002 112s)。
This commit is contained in:
xst
2026-09-02 11:59:46 +08:00
parent 6ee7ade67d
commit 2aca405267
310 changed files with 78629 additions and 157 deletions
@@ -0,0 +1,210 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>自动化测试报告 - 2026-09-02 10:05:27</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Microsoft YaHei','PingFang SC',sans-serif;background:#f5f7fa;color:#333;line-height:1.6}
.header{background:linear-gradient(135deg,#409eff,#337ecc);color:#fff;padding:24px 32px}
.header h1{font-size:22px;font-weight:500}
.header .sub{font-size:13px;opacity:.75;margin-top:6px}
.summary{display:flex;gap:20px;padding:20px 32px 12px;background:#fff}
.card{flex:1;text-align:center;padding:14px;border-radius:8px}
.card .num{font-size:32px;font-weight:600}
.card .label{font-size:13px;color:#909399;margin-top:2px}
.card.total{background:#f0f5ff}.card.total .num{color:#409eff}
.card.pass{background:#f0f9eb}.card.pass .num{color:#67c23a}
.card.fail{background:#fef0f0}.card.fail .num{color:#f56c6c}
.card.skip{background:#fdf6ec}.card.skip .num{color:#e6a23c}
.meta-row{display:flex;gap:24px;padding:8px 32px 20px;background:#fff;border-bottom:1px solid #e4e7ed;font-size:13px;color:#909399}
.section-title{font-size:16px;font-weight:500;padding:20px 32px 12px;background:#fff}
.tbl-wrap{margin:0 32px 20px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);overflow-x:auto}
table{width:100%;border-collapse:collapse;min-width:900px}
th{background:#f5f7fa;text-align:left;padding:8px 12px;font-size:12px;color:#909399;font-weight:500;border-bottom:2px solid #e4e7ed;white-space:nowrap}
td{padding:8px 12px;font-size:13px;border-bottom:1px solid #ebeef5;vertical-align:middle}
tr:hover td{background:#f5f7fa}
/* ── 状态 ── */
.s-pass{color:#67c23a;font-weight:600}
.s-fail{color:#f56c6c;font-weight:600}
.s-skip{color:#e6a23c;font-weight:600}
/* ── 通过行 ── */
.case-name{font-weight:500}
.case-desc{font-size:12px;color:#909399;margin-top:3px;max-width:300px}
/* ── 失败/跳过:折叠 head bar ── */
.case-head td{padding:0!important;border-bottom:none!important}
.case-head-bar{display:flex;align-items:center;gap:10px;padding:8px 12px;cursor:pointer;user-select:none;border-left:3px solid transparent}
.case-head-bar:hover{filter:brightness(.98)}
.case-head-bar .chev{font-size:10px;color:#909399;width:14px;text-align:center;flex-shrink:0}
.case-head-bar.open{background:#f0f5ff}
.case-head-s-fail .case-head-bar{border-left-color:#f56c6c}
.case-head-s-skip .case-head-bar{border-left-color:#e6a23c}
.case-no{font-size:12px;color:#909399;min-width:22px;text-align:center}
.case-title{flex:1;font-weight:500;font-size:13px}
.case-time{font-size:12px;color:#909399;min-width:48px;text-align:right}
.meta-badges{display:flex;gap:6px;flex-shrink:0}
.mi-id{font-size:10.5px;background:#ecf5ff;color:#409eff;padding:1px 7px;border-radius:10px}
.mi-pri{font-size:10.5px;padding:1px 7px;border-radius:10px}
.mi-pri-p0{background:#fef0f0;color:#f56c6c}
.mi-pri-p1{background:#fdf6ec;color:#e6a23c}
.mi-pri-p2{background:#f0f9eb;color:#67c23a}
.mi-tag{font-size:10.5px;background:#f5f7fa;color:#909399;padding:1px 7px;border-radius:10px}
/* ── 详情行 ── */
.case-detail-row td{padding:0!important;border-bottom:1px solid #ebeef5}
.case-detail-body{padding:14px 20px;background:#fafafa;border-top:1px solid #ebeef5}
.case-detail-body .case-err{margin-bottom:10px}
.case-detail-body .err-label{font-size:12px;color:#f56c6c;font-weight:600}
.case-detail-body .err-msg{font-size:11px;background:#fff7f7;color:#f56c6c;padding:8px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto;margin-top:4px}
.case-detail-body .phases{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:10px}
.case-detail-body .phases span{font-size:11px;padding:2px 8px;border-radius:10px}
.case-detail-body .phase-phase{background:#e6f7ff;color:#1890ff}
.case-detail-body .phase-done{background:#f6ffed;color:#52c41a}
.case-detail-body .case-shots{margin-bottom:10px}
.case-detail-body .case-shots-title{font-size:12px;color:#606266;font-weight:500;margin-bottom:6px}
.shot-gallery-inline{display:flex;flex-wrap:wrap;gap:10px}
.shot-card-inline{width:160px;border-radius:4px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.08);background:#fff}
.shot-thumb-inline{width:100%;height:110px;overflow:hidden;background:#f5f7fa;cursor:pointer;position:relative}
.shot-thumb-inline img{width:100%;height:100%;object-fit:contain;display:block}
.shot-thumb-inline::after{content:'🔍 点击放大';position:absolute;bottom:0;left:0;right:0;padding:3px;background:rgba(0,0,0,.5);color:#fff;font-size:10px;text-align:center;opacity:0;transition:opacity .2s}
.shot-thumb-inline:hover::after{opacity:1}
.shot-label-inline{font-size:10px;color:#606266;padding:3px 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.case-detail-body .case-log-section{margin-top:10px}
.case-detail-body .case-log-title{font-size:12px;color:#606266;font-weight:500;margin-bottom:4px}
.case-detail-body .case-log-content{font-size:10.5px;background:#1e1e1e;color:#d4d4d4;padding:8px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:300px;overflow-y:auto;font-family:monospace}
/* ── 日志全文 ── */
.log-section{margin:0 32px 12px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);padding:12px 20px}
.log-section summary{font-size:14px;font-weight:500;cursor:pointer;padding:4px 0}
.log-content{font-size:11px;background:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:400px;overflow-y:auto;font-family:monospace}
/* ── 底部截图汇总 ── */
.shot-gallery{display:flex;flex-wrap:wrap;gap:12px;padding:6px 0}
.shot-card{width:240px;border-radius:6px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.08);background:#fff;transition:box-shadow .2s}
.shot-card:hover{box-shadow:0 4px 16px rgba(0,0,0,.15)}
.shot-thumb{width:100%;height:170px;overflow:hidden;cursor:pointer;position:relative;background:#f5f7fa}
.shot-thumb img{width:100%;height:100%;object-fit:contain;display:block}
.shot-thumb::after{content:'🔍 点击放大';position:absolute;bottom:0;left:0;right:0;padding:6px;background:rgba(0,0,0,.5);color:#fff;font-size:11px;text-align:center;opacity:0;transition:opacity .2s}
.shot-thumb:hover::after{opacity:1}
.shot-label{font-size:11px;color:#606266;padding:5px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.shot-group{margin:0 0 6px}
.shot-group summary{font-size:13px;font-weight:500;cursor:pointer;padding:3px 0;color:#606266}
.ft{text-align:center;padding:24px;font-size:12px;color:#c0c4cc}
/* ── 截图放大 lightbox ── */
.lb{display:none;position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,.88);z-index:99999;align-items:center;justify-content:center;cursor:zoom-out}
.lb-img{max-width:92vw;max-height:92vh;object-fit:contain;box-shadow:0 0 30px rgba(0,0,0,.5);border-radius:4px;cursor:zoom-out}
.lb-close{position:absolute;top:16px;right:24px;color:#fff;font-size:32px;line-height:1;cursor:pointer;opacity:.85;z-index:1}
.lb-close:hover{opacity:1}
</style>
</head>
<body>
<div class="header">
<h1>🚀 自动化测试报告</h1>
<div class="sub">运八网络货运平台 · QaAutomationHub · 2026-09-02 10:05:27</div>
</div>
<div class="summary">
<div class="card total"><div class="num">0</div><div class="label">总计</div></div>
<div class="card pass"><div class="num">0</div><div class="label">通过</div></div>
<div class="card fail"><div class="num">0</div><div class="label">失败</div></div>
<div class="card skip"><div class="num">0</div><div class="label">跳过</div></div>
</div>
<div class="meta-row">
<span>执行时间: 2026-09-02 10:05:27</span>
<span>套件耗时: 0.5s</span>
<span>通过率: 0.0%</span>
</div>
<div class="tbl-wrap">
<table>
<thead><tr>
<th>#</th><th>用例名称 / 描述</th><th>状态</th>
<th>用例ID</th><th>优先级</th><th>标签</th><th>耗时(s)</th><th>阶段/备注</th>
</tr></thead>
<tbody>
</tbody>
</table>
</div>
<div class="section-title">📋 测试日志</div>
<details class="log-section">
<summary>📄 test_run_20260902_095403.log (全文)</summary>
<pre class="log-content">2026-09-02 09:54:03 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:54:03 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
2026-09-02 09:54:03 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:54:27 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 接单流程完成
2026-09-02 09:54:43 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 装货流程完成
2026-09-02 09:55:00 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 卸货流程完成
2026-09-02 09:55:04 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 运输单号: RHJC040026090100010951040132
2026-09-02 09:55:16 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:55:16 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
2026-09-02 09:55:16 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:55:31 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 接单流程完成
2026-09-02 09:55:53 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 装货流程完成
2026-09-02 09:56:08 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 卸货流程完成
2026-09-02 09:56:10 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 运输单号: RHJC040026090100010952080133
2026-09-02 09:56:22 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:56:22 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
2026-09-02 09:56:22 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:56:29 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
2026-09-02 09:56:37 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 接单流程完成
2026-09-02 09:56:37 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
2026-09-02 09:57:03 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 装货流程完成
2026-09-02 09:57:03 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
2026-09-02 09:57:19 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 卸货流程完成
2026-09-02 09:57:19 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
2026-09-02 09:57:20 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 运输单号: RHJC040026090100010953150134
2026-09-02 09:57:20 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
2026-09-02 09:57:31 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 运费核算完成: RHJC040026090100010953150134
2026-09-02 09:57:31 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
2026-09-02 09:57:38 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 运单审核完成: RHJC040026090100010953150134
2026-09-02 09:57:38 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
2026-09-02 09:57:46 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 垫资-财务打款完成: RHJC040026090100010953150134
2026-09-02 09:57:46 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
2026-09-02 09:57:57 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 垫资-货主打款完成: RHJC040026090100010953150134
2026-09-02 09:57:57 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:57:57 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程结束!
2026-09-02 09:57:57 [INFO] tests.cross_end.test_driver_to_settlement — 运输单号: RHJC040026090100010953150134
2026-09-02 09:57:57 [INFO] tests.cross_end.test_driver_to_settlement — 核算完成: True
2026-09-02 09:57:57 [INFO] tests.cross_end.test_driver_to_settlement — 审核完成: True
2026-09-02 09:57:57 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:58:02 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:58:02 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
2026-09-02 09:58:02 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
2026-09-02 09:58:08 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
2026-09-02 09:58:19 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 接单流程完成
2026-09-02 09:58:19 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
2026-09-02 09:58:41 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 装货流程完成
2026-09-02 09:58:41 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
2026-09-02 09:58:56 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 卸货流程完成
2026-09-02 09:58:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
2026-09-02 09:58:58 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 运输单号: RHJC040026090100010954560135
2026-09-02 09:58:58 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
2026-09-02 09:59:12 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 运费核算完成(车队长全额收款): RHJC040026090100010954560135
2026-09-02 09:59:12 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
2026-09-02 09:59:19 [INFO] tests.cross_end.test_driver_to_settlement — -&gt; 运单审核完成: RHJC040026090100010954560135
2026-09-02 09:59:19 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
2026-09-02 09:59:44 [INFO] tests.cross_end.test_freight_full_flow — ============================================================
2026-09-02 09:59:44 [INFO] tests.cross_end.test_freight_full_flow — 跨端 E2E: 货运全流程开始
2026-09-02 09:59:44 [INFO] tests.cross_end.test_freight_full_flow — ============================================================
2026-09-02 09:59:51 [INFO] tests.cross_end.test_freight_full_flow — Step 1/8: Web管理端 — 发布货源
</pre>
</details>
<div class="section-title">📸 截图汇总</div>
<div class="log-section"><p style="color:#909399">暂无截图</p></div>
<div class="ft">报告自动生成于 2026-09-02 10:05:27 · QaAutomationHub 自动化测试框架</div>
<div id="lb" class="lb" onclick="closeZoom()">
<div class="lb-close">✕</div>
<img class="lb-img" alt="截图预览">
</div>
<script>
function zoomImg(t){var lb=document.getElementById('lb');var img=lb.querySelector('.lb-img');img.src=t.querySelector('img').src;img.alt=t.querySelector('img').alt||'';lb.style.display='flex';document.body.style.overflow='hidden'}
function closeZoom(){var lb=document.getElementById('lb');lb.style.display='none';document.body.style.overflow=''}
document.addEventListener('keydown',function(e){if(e.key==='Escape')closeZoom()})
</script>
</body></html>