"""司机端小程序 fixture — Playwright(模拟微信 WebView)。 核心机制: 模拟微信内置浏览器 UA,微信 WebView 仍需登录态。 首次使用 python tests/web/admin/save_auth.py 生成后用在此端也可以。 """ from datetime import datetime from pathlib import Path import pytest from playwright.sync_api import sync_playwright, Page SCREENSHOTS_DIR = Path("output/screenshots") @pytest.fixture def page(mini_program_config, request) -> Page: """微信 WebView 模拟 Page。""" viewport = mini_program_config.get("viewport", {"width": 375, "height": 812}) timeout = mini_program_config.get("timeout_seconds", 120) * 1000 user_agent = mini_program_config.get("user_agent", "Mozilla/5.0 MicroMessenger/8.0.0") base_url = mini_program_config["base_url"] with sync_playwright() as p: browser = p.chromium.launch(headless=True) context = browser.new_context( viewport={"width": viewport["width"], "height": viewport["height"]}, user_agent=user_agent, locale="zh-CN", ) page = context.new_page() page.set_default_timeout(timeout) yield page if hasattr(request.node, "rep_call") and request.node.rep_call.failed: scenario_dir = SCREENSHOTS_DIR / request.node.name scenario_dir.mkdir(parents=True, exist_ok=True) ts = datetime.now().strftime("%Y%m%d_%H%M%S") path = str(scenario_dir / f"FAIL_mini_{ts}.png") page.screenshot(path=path) context.close() browser.close() @pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item, call): outcome = yield rep = outcome.get_result() setattr(item, f"rep_{rep.when}", rep)