Files

119 lines
5.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Agentic QE Fleet — Playwright 自动化测试脚本
需求: 安徽运八需求
生成时间: 2026-07-14T03:40:32.591309+00:00
目标浏览器: chromium, firefox, webkit
对应测试用例: E:\test\QaAutomationHub\output\test_cases\安徽运八需求_测试用例.md
用例数量: 18
"""
import asyncio
from pathlib import Path
from datetime import datetime
from playwright.async_api import async_playwright
SCREENSHOTS_DIR = Path(r"E:\test\QaAutomationHub\output\screenshots\安徽运八需求")
SCREENSHOT_ON_FAILURE = True
SCREENSHOT_ON_STEP = False
TIMEOUT = 120000
def screenshot_path(name: str, browser: str) -> str:
"""生成截图路径。"""
SCREENSHOTS_DIR.mkdir(parents=True, exist_ok=True)
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
return str(SCREENSHOTS_DIR / f"{name}_{browser}_{ts}.png")
async def run_test(browser_type: str, browser_name: str):
"""执行单个浏览器的测试。"""
results = {"passed": 0, "failed": 0, "screenshots": [], "errors": []}
async with async_playwright() as p:
browser_launcher = getattr(p, browser_type)
browser = await browser_launcher.launch(headless=True)
context = await browser.new_context(
viewport={"width": 1920, "height": 1080},
locale="zh-CN",
)
page = await context.new_page()
page.set_default_timeout(TIMEOUT)
# ============================================================
# 以下为测试用例骨架,请根据实际测试环境配置 BASE_URL 和测试数据
# ============================================================
BASE_URL = "http://localhost:3000" # ⚠️ 请修改为实际测试环境地址
try:
# ── 测试准备: 登录 ──
# await page.goto(f"{BASE_URL}/login")
# await page.screenshot(path=screenshot_path('01_login', browser_name))
# ── 从测试用例自动生成的测试步骤 ──
# [P0] AH_REPORT_DASH_001: 验证看板按完整运单号精确搜索运单
# → 进入"监管上报-上报看板"页面;2. 在运单号搜索框中输入完整运单号"YB202607130001"3. 点击搜索按钮或按回车键
# await page.screenshot(path=screenshot_path('AH_REPORT_DASH_001', browser_name))
# [P0] AH_REPORT_DASH_002: 验证看板按运单号模糊搜索匹配多条记录
# → 进入"监管上报-上报看板"页面;2. 在运单号搜索框中输入"YB20260713"3. 点击搜索
# await page.screenshot(path=screenshot_path('AH_REPORT_DASH_002', browser_name))
# [P1] AH_REPORT_DASH_003: 验证看板按不存在的单号搜索显示空结果
# → 进入"监管上报-上报看板"页面;2. 在运单号搜索框中输入不存在的单号"NOTEXIST999"3. 点击搜索
# await page.screenshot(path=screenshot_path('AH_REPORT_DASH_003', browser_name))
# [P1] AH_REPORT_DASH_004: 验证看板按"第一次上报"阶段筛选运单
# → 进入"监管上报-上报看板"页面,默认为"全部";2. 点击上报阶段下拉框,选择"第一次上报";3. 观察列表数据
# await page.screenshot(path=screenshot_path('AH_REPORT_DASH_004', browser_name))
# [P1] AH_REPORT_DASH_005: 验证看板按"异常"核验状态筛选运单
# → 进入"监管上报-上报看板"页面;2. 点击核验状态下拉框,选择"异常";3. 观察列表数据
# await page.screenshot(path=screenshot_path('AH_REPORT_DASH_005', browser_name))
# [P1] AH_REPORT_DASH_006: 验证看板按"申诉中"申诉状态筛选运单
# → 进入"监管上报-上报看板"页面;2. 点击申诉状态下拉框,选择"申诉中";3. 观察列表数据并与全部列表对比
# await page.screenshot(path=screenshot_path('AH_REPORT_DASH_006', browser_name))
# [P1] AH_REPORT_DASH_007: 验证看板组合筛选—第二次上报+异常+申诉中+运单号模糊搜索
# → 进入"监管上报-上报看板"页面;2. 上报阶段选"第二次上报"3. 核验状态选"异常"4. 申诉状态选"申诉中"5. 运单号输入"YB2026"6. 点击搜索
# await page.screenshot(path=screenshot_path('AH_REPORT_DASH_007', browser_name))
results["passed"] += 1
except Exception as exc:
results["failed"] += 1
results["errors"].append(str(exc))
if SCREENSHOT_ON_FAILURE:
path = screenshot_path('failure', browser_name)
await page.screenshot(path=path)
results["screenshots"].append(path)
print(f"📸 失败截图: {path}")
finally:
await browser.close()
return results
async def main():
"""主执行入口。"""
all_results = {}
for browser_type in ['chromium', 'firefox', 'webkit']:
print(f"\n🚀 启动浏览器: {browser_type}")
results = await run_test(browser_type, browser_type)
all_results[browser_type] = results
print(f" ✅ {results['passed']} 通过, ❌ {results['failed']} 失败")
# 汇总
total_passed = sum(r["passed"] for r in all_results.values())
total_failed = sum(r["failed"] for r in all_results.values())
total_screenshots = sum(len(r["screenshots"]) for r in all_results.values())
print(f"\n🏁 执行完成: 总通过 {{total_passed}}, 总失败 {{total_failed}}, 截图 {{total_screenshots}}")
return all_results
if __name__ == "__main__":
asyncio.run(main())