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
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}')
|
|
|