# -*- coding: utf-8 -*- """A7 页面批量截图:Playwright file:// 渲染 fullPage 截 PNG。 用法: python shot-a7.py [--only=a7-3-1] 产物: .scratch/a7-parity/shots/<页面名>.png + shot-a7.json 结果 """ import argparse, json, io, os, sys, time from pathlib import Path sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') ROOT = Path(r'e:\code\crm-backend-matt\.scratch\a7-parity') PAGES = ROOT / 'pages' SHOTS = ROOT / 'shots' SHOTS.mkdir(exist_ok=True) parser = argparse.ArgumentParser() parser.add_argument('--only', default=None) args = parser.parse_args() # 每页目录 = pages//,主 HTML = 目录内唯一顶层 *.html(排除 resources/files/data/images 子路径) page_dirs = sorted([d for d in PAGES.iterdir() if d.is_dir()]) targets = [] for d in page_dirs: if args.only and args.only not in d.name: continue tops = [f for f in d.iterdir() if f.is_file() and f.suffix == '.html'] if len(tops) != 1: print(f'SKIP {d.name}: top-level html count = {len(tops)}') continue targets.append((d.name, tops[0])) print(f'targets: {len(targets)}') from playwright.sync_api import sync_playwright results = [] with sync_playwright() as p: browser = p.chromium.launch() ctx = browser.new_context(viewport={'width': 1600, 'height': 900}, device_scale_factor=1) # 蓝湖把 data.js 包成 $axure.loadCurrentPage(lanhu_Axure_Mapping_Data({...})), # 该函数是蓝湖 CDN 端的资源路径映射器;本地渲染资源已按相对路径落盘,恒等注入即可。 ctx.add_init_script( "window.lanhu_Axure_Mapping_Data = function(d){ return d; };") page = ctx.new_page() errors_by_page = {} page.on('pageerror', lambda e: errors_by_page.setdefault('js', []).append(str(e)[:120])) for name, html_path in targets: errors_by_page.clear() url = 'file:///' + str(html_path).replace('\\', '/') try: page.goto(url, wait_until='domcontentloaded', timeout=30000) except Exception as e: print(f' goto warn: {name}: {str(e)[:100]}') time.sleep(2.5) # 同步脚本链跑完 # 主动触发所有 data-src 懒加载图(若仍有残留) page.evaluate("""() => { document.querySelectorAll('img[data-src]').forEach(img => { img.src = img.getAttribute('data-src'); }); }""") time.sleep(0.6) out = SHOTS / f'{name}.png' page.screenshot(path=str(out), full_page=True) size = out.stat().st_size dim = page.evaluate("() => [document.documentElement.scrollWidth, document.documentElement.scrollHeight]") print(f'OK {name} {size/1024:.0f}KB dim={dim[0]}x{dim[1]} jserr={len(errors_by_page.get("js", []))}') results.append({'page': name, 'png': str(out), 'kb': round(size/1024), 'dim': dim, 'js_errors': len(errors_by_page.get('js', []))}) browser.close() (ROOT / 'shot-a7.json').write_text(json.dumps(results, ensure_ascii=False, indent=1), encoding='utf-8') print(f'done: {len(results)}/{len(targets)} shots -> {SHOTS}')