File size: 2,130 Bytes
cf20894
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
"""Load registry scrolls in headless Chromium and screenshot each one.
usage: python3 tests/e2e_scrolls.py <base url> <screenshot dir> [id ...]"""
import json, os, sys
from playwright.sync_api import sync_playwright
base, shots, ids = sys.argv[1].rstrip('/') + '/', sys.argv[2], sys.argv[3:]
os.makedirs(shots, exist_ok=True)
fails = []
with sync_playwright() as pw:
    br = pw.chromium.launch(args=['--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'])
    for sid in ids:
        p = br.new_page(viewport={'width': 1440, 'height': 900})
        errs = []
        p.on('pageerror', lambda e: errs.append(str(e)))
        p.goto(f'{base}#s={sid}', wait_until='load')
        try:
            p.wait_for_selector('#loader', state='detached', timeout=180000)
            p.wait_for_timeout(2500)
            info = p.evaluate('() => ({ s: window.__unroll.scroll(), why: document.querySelector("#layerWhy").hidden ? null : document.querySelector("#layerWhy summary").textContent, badge: !document.querySelector("#prizeBadge").hidden, opts: window.unrollScrolls.visible().length })')
            p.evaluate('() => window.unrollScrolls.setPrizeEligibleOnly(true)')
            only = p.evaluate('() => window.unrollScrolls.visible()')
            p.evaluate('() => window.unrollScrolls.setPrizeEligibleOnly(false)')
            ok = info['s']['id'] == sid and not errs
            print(('ok   ' if ok else 'FAIL ') + sid, json.dumps({**info, 's': {k: info['s'][k] for k in ('id', 'layers', 'inkLayers', 'prizeEligible')}, 'nWindings': len(info['s']['windings']), 'eligibleOnly': only}), errs[:2])
            if not ok: fails.append(sid)
        except Exception as e:
            print('FAIL', sid, str(e)[:200], errs[:2]); fails.append(sid)
        # CDP capture: the page's render loop keeps Playwright's own screenshot waiting under software GL
        import base64
        cdp = p.context.new_cdp_session(p)
        open(f'{shots}/scroll_{sid}.png', 'wb').write(base64.b64decode(cdp.send('Page.captureScreenshot', {'format': 'png'})['data']))
        p.close()
    br.close()
sys.exit(1 if fails else 0)