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:
@@ -0,0 +1,225 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>自动化测试报告 - 2026-07-29 11:07:31</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:24px 32px 12px;background:#fff}
|
||||
.card{flex:1;text-align:center;padding:16px;border-radius:8px}
|
||||
.card .num{font-size:36px;font-weight:600}
|
||||
.card .label{font-size:14px;color:#909399;margin-top:4px}
|
||||
.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:600px}
|
||||
th{background:#f5f7fa;text-align:left;padding:10px 14px;font-size:13px;color:#909399;font-weight:500;border-bottom:2px solid #e4e7ed;white-space:nowrap}
|
||||
td{padding:0;border-bottom:1px solid #ebeef5;vertical-align:top}
|
||||
|
||||
/* ── 可折叠用例行 ── */
|
||||
.case-detail[open] .case-summary{background:#f0f5ff}
|
||||
.case-summary{display:flex;align-items:center;gap:12px;padding:10px 14px;cursor:pointer;list-style:none;user-select:none}
|
||||
.case-summary::-webkit-details-marker{display:none}
|
||||
.case-summary::before{content:'▶';font-size:10px;color:#909399;transition:transform .15s;width:14px;text-align:center}
|
||||
details[open]>.case-summary::before{transform:rotate(90deg)}
|
||||
.case-summary:hover{background:#f5f7fa}
|
||||
.case-idx{font-size:12px;color:#909399;min-width:24px;text-align:center;font-variant-numeric:tabular-nums}
|
||||
.case-title{flex:1;font-weight:500;font-size:13px}
|
||||
.case-desc-inline{font-size:12px;color:#909399;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
.case-time{font-size:12px;color:#909399;min-width:48px;text-align:right}
|
||||
.s-pass{color:#67c23a;font-weight:600}
|
||||
.s-fail{color:#f56c6c;font-weight:600}
|
||||
.s-skip{color:#e6a23c;font-weight:600}
|
||||
.case-row-s-pass .case-summary{border-left:3px solid #67c23a}
|
||||
.case-row-s-fail .case-summary{border-left:3px solid #f56c6c}
|
||||
.case-row-s-skip .case-summary{border-left:3px solid #e6a23c}
|
||||
|
||||
/* ── 展开后详情 ── */
|
||||
.detail-body{padding:12px 20px 16px;border-top:1px solid #ebeef5}
|
||||
.detail-meta{display:flex;flex-wrap:wrap;gap:8px 24px;margin-bottom:10px}
|
||||
.meta-item{display:flex;gap:4px;font-size:12px}
|
||||
.meta-label{color:#909399;font-weight:500}
|
||||
.meta-value{color:#333}
|
||||
.case-err{margin-top:8px}
|
||||
.err-label{font-size:12px;color:#f56c6c;font-weight:600;margin-bottom:4px}
|
||||
.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}
|
||||
.case-shots{margin-top:10px}
|
||||
.case-shots-title{font-size:12px;color:#606266;font-weight:500;margin-bottom:6px}
|
||||
.case-log-section{margin-top:10px;border:1px solid #e4e7ed;border-radius:4px;overflow:hidden}
|
||||
.case-log-section summary{font-size:12px;font-weight:500;cursor:pointer;padding:6px 10px;background:#fafafa;color:#606266}
|
||||
.case-log-content{font-size:10.5px;background:#1e1e1e;color:#d4d4d4;padding:8px;white-space:pre-wrap;word-break:break-all;max-height:300px;overflow-y:auto;font-family:'Consolas','Courier New',monospace;margin:0}
|
||||
|
||||
.phases{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px}
|
||||
.phases span{font-size:11px;padding:2px 8px;border-radius:10px;white-space:nowrap}
|
||||
.phase-phase{background:#e6f7ff;color:#1890ff}
|
||||
.phase-done{background:#f6ffed;color:#52c41a}
|
||||
|
||||
/* ── 日志 ── */
|
||||
.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:'Consolas','Courier New',monospace}
|
||||
|
||||
/* ── 截图 ── */
|
||||
.shot-gallery{display:flex;flex-wrap:wrap;gap:12px;padding:4px 0}
|
||||
.shot-card-sm{width:200px;border-radius:6px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.08);background:#fff;transition:box-shadow .2s}
|
||||
.shot-card-sm:hover{box-shadow:0 4px 16px rgba(0,0,0,.15)}
|
||||
.shot-card-sm .shot-thumb{width:100%;height:140px;overflow:hidden;cursor:pointer;position:relative;background:#f5f7fa}
|
||||
.shot-card-sm .shot-thumb img{width:100%;height:100%;object-fit:contain;display:block}
|
||||
.shot-card-sm .shot-label{font-size:10px;color:#606266;padding:4px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.shot-thumb.expanded{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;z-index:9999;background:rgba(0,0,0,.85);border-radius:0!important}
|
||||
.shot-thumb.expanded img{width:auto;height:auto;max-width:100%;max-height:100%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
|
||||
.shot-thumb::after{content:'🔍';position:absolute;bottom:4px;right:6px;font-size:12px;opacity:0;transition:opacity .2s}
|
||||
.shot-thumb:hover::after{opacity:.7}
|
||||
.shot-group{margin:0 0 8px}
|
||||
.shot-group summary{font-size:13px;font-weight:500;cursor:pointer;padding:4px 0;color:#606266}
|
||||
.ft{text-align:center;padding:24px;font-size:12px;color:#c0c4cc}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>🚀 自动化测试报告</h1>
|
||||
<div class="sub">运八网络货运平台 · QaAutomationHub · 2026-07-29 11:07:31</div>
|
||||
</div>
|
||||
|
||||
<div class="summary">
|
||||
<div class="card total"><div class="num">2</div><div class="label">总计</div></div>
|
||||
<div class="card pass"><div class="num">1</div><div class="label">通过</div></div>
|
||||
<div class="card fail"><div class="num">1</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-07-29 11:07:31</span>
|
||||
<span>套件耗时: 200.3s</span>
|
||||
<span>通过率: 50.0%</span>
|
||||
<span style="cursor:pointer;color:#409eff" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=true)">📂 全部展开</span>
|
||||
<span style="cursor:pointer;color:#909399" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=false)">📁 全部折叠</span>
|
||||
</div>
|
||||
<div class="tbl-wrap">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th style="width:36px">#</th><th>状态</th><th>用例名称 / 描述</th><th>耗时(s)</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr class="case-row case-row-s-pass">
|
||||
<td colspan="4" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">1</span>
|
||||
<span class="s-pass">✅ 通过</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款完整流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-001 用例名称: 司机APP接单到管理端核算打款完整流程 优先级: P0 标签: cross</span>
|
||||
<span class="case-time">92.2s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-body">
|
||||
<div class="detail-meta">
|
||||
<div class="meta-item"><span class="meta-label">用例ID</span><span class="meta-value">TC-D2S-001</span></div>
|
||||
<div class="meta-item"><span class="meta-label">优先级</span><span class="meta-value">P0</span></div>
|
||||
<div class="meta-item"><span class="meta-label">标签</span><span class="meta-value">cross_end, smoke</span></div>
|
||||
<div class="meta-item"><span class="meta-label">耗时</span><span class="meta-value">92.2s</span></div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="case-row case-row-s-fail">
|
||||
<td colspan="4" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">2</span>
|
||||
<span class="s-fail">❌ 失败</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款-车队长全额收款流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-002 用例名称: 司机APP接单到管理端核算打款-车队长全额收款流程 优先级: P0 标签:</span>
|
||||
<span class="case-time">107.8s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-body">
|
||||
<div class="detail-meta">
|
||||
<div class="meta-item"><span class="meta-label">用例ID</span><span class="meta-value">TC-D2S-002</span></div>
|
||||
<div class="meta-item"><span class="meta-label">优先级</span><span class="meta-value">P0</span></div>
|
||||
<div class="meta-item"><span class="meta-label">标签</span><span class="meta-value">cross_end, smoke</span></div>
|
||||
<div class="meta-item"><span class="meta-label">耗时</span><span class="meta-value">107.8s</span></div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="case-err">
|
||||
<div class="err-label">错误信息</div>
|
||||
<pre class="err-msg">playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
Call log:
|
||||
- waiting for locator("table tbody tr") to be visible
|
||||
14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></pre>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="section-title">📋 测试日志</div>
|
||||
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_110415.log (全文)</summary>
|
||||
<pre class="log-content">2026-07-29 11:04:15 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:04:15 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 11:04:15 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:04:24 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 11:04:32 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 11:04:32 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 11:04:54 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 11:04:54 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 11:05:08 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 11:05:08 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 11:05:10 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:10 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 11:05:20 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:20 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 11:05:27 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:27 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 11:05:35 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:35 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-货主打款完成: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程结束!
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — 运输单号: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — 核算完成: True
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — 审核完成: True
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:05:48 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:05:48 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
|
||||
2026-07-29 11:05:48 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:05:53 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 11:06:03 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 11:06:03 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 11:06:25 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 11:06:25 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 11:06:39 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 11:06:39 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 11:06:41 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011103320010
|
||||
2026-07-29 11:06:41 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
|
||||
2026-07-29 11:06:55 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成(车队长全额收款): RHJC040026072700011103320010
|
||||
2026-07-29 11:06:55 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 11:07:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011103320010
|
||||
2026-07-29 11:07:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 11:07:10 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011103320010
|
||||
2026-07-29 11:07:10 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<div class="section-title">📸 截图汇总</div>
|
||||
<div class="log-section"><p style="color:#909399">暂无截图</p></div>
|
||||
<div class="ft">报告自动生成于 2026-07-29 11:07:31 · QaAutomationHub 自动化测试框架</div>
|
||||
</body></html>
|
||||
Reference in New Issue
Block a user