"""Test offline actual renderer composed HTML and 390px responsiveness."""
import json
from pathlib import Path
from playwright.sync_api import sync_playwright
root=Path(__file__).resolve().parents[1]
raw=(root/'examples/V8_34_主题Banner与产品卡片_真实渲染交互预览.html').read_text()
out=root/'reports/v834';out.mkdir(parents=True,exist_ok=True)
results=[]
with sync_playwright() as p:
browser=p.chromium.launch(executable_path='/usr/bin/chromium',headless=True,args=['--no-sandbox'])
page=browser.new_page(viewport={'width':1480,'height':950},device_scale_factor=1)
errors=[];page.on('pageerror',lambda err:errors.append(str(err)))
page.set_content(raw,wait_until='load')
page.locator('#canvas').wait_for()
for theme in ['automotive','industrial']:
page.locator('#theme').select_option(theme)
for variant in ['split','image-first','centered']:
page.locator('#banner').select_option(variant)
for cards in ['standard','compact','showcase']:
page.locator('#cards').select_option(cards)
for width in ['100%','390px']:
page.locator(f'[data-width="{width}"]').click()
page.wait_for_timeout(80)
frame=page.frame_locator('#canvas')
hero=frame.locator('.sf-hero-grid')
item=frame.locator('.sf-section.sf-collection > .sf-container > .sf-collection')
assert hero.count()==1,(theme,variant,cards,width)
assert item.count()==1,(theme,variant,cards,width)
assert f'sf-hero-layout-{variant}' in hero.get_attribute('class')
assert f'sf-card-style-{cards}' in item.get_attribute('class')
overflow=frame.locator('body').evaluate('(e)=>e.scrollWidth>document.documentElement.clientWidth+1')
results.append({'theme':theme,'banner':variant,'cards':cards,'width':width,'overflow':bool(overflow)})
# canonical screenshots
page.locator('#theme').select_option('industrial');page.locator('#banner').select_option('centered');page.locator('#cards').select_option('showcase');page.locator('[data-width="100%"]').click()
page.wait_for_timeout(120)
page.screenshot(path=str(out/'v834-desktop.png'),full_page=True)
page.locator('[data-width="390px"]').click();page.wait_for_timeout(120)
page.screenshot(path=str(out/'v834-phone.png'),full_page=True)
assert not errors,errors
browser.close()
report={'cases':len(results),'overflows':[x for x in results if x['overflow']],'js_errors':errors,'screenshots':['v834-desktop.png','v834-phone.png']}
(out/'browser-check.json').write_text(json.dumps(report,indent=2,ensure_ascii=False))
print(json.dumps({'cases':len(results),'overflows':len(report['overflows']),'js_errors':errors},ensure_ascii=False))