119 lines
5.5 KiB
Python
119 lines
5.5 KiB
Python
"""
|
||
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())
|