"""Load registry scrolls in headless Chromium and screenshot each one. usage: python3 tests/e2e_scrolls.py [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)