You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

74 lines
3.2 KiB

# -*- 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/<name>/,主 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}')