"""WTP final · Infra Live Widget + V80 drawer · Playwright E2E""" import time, json from pathlib import Path from playwright.sync_api import sync_playwright TS = time.strftime("%Y%m%d-%H%M%S") OUT = Path(f"/var/www/html/test-report/wtp-final-{TS}") OUT.mkdir(parents=True, exist_ok=True) results = {"ts": TS, "tests": []} try: with sync_playwright() as p: browser = p.chromium.launch(headless=True, args=["--no-sandbox"]) ctx = browser.new_context( viewport={"width":1700,"height":1100}, ignore_https_errors=True, record_video_dir=str(OUT), record_video_size={"width":1700,"height":1100} ) page = ctx.new_page() page.goto(f"https://weval-consulting.com/weval-technology-platform.html?final={TS}", wait_until="networkidle", timeout=25000) time.sleep(8) # Test 1: hero + KPIs page.screenshot(path=str(OUT/"01-wtp-hero.png"), full_page=False) kpis_hero = page.evaluate("""() => { const out = {}; const getTxt = id => { const el = document.getElementById(id); return el ? (el.textContent || el.innerText || '').replace(/\\s+/g,' ').trim() : null; }; out.agents = getTxt('vm-gauge-agents'); out.cov = getTxt('vm-gauge-cov'); out.ethica = getTxt('vm-gauge-ethica'); out.sovereign = getTxt('vm-gauge-sovereign'); return out; }""") results["tests"].append({"test":"hero_kpis", "data":kpis_hero}) print(f" ✓ Hero KPIs: {kpis_hero}") # Test 2: V80 drawer try: page.click("#v80-toggle", timeout=3000) time.sleep(3) page.screenshot(path=str(OUT/"02-v80-drawer-open.png"), full_page=False) nav_items = page.evaluate("[...document.querySelectorAll('#v80-drawer a')].length") results["tests"].append({"test":"v80_drawer", "nav_items":nav_items}) print(f" ✓ V80 drawer: {nav_items} nav items") # Close drawer page.click(".v80-close", timeout=2000) time.sleep(2) except Exception as e: results["tests"].append({"test":"v80_drawer", "err":str(e)[:100]}) # Test 3: scroll to Infrastructure Widget page.evaluate("document.getElementById('wtp-infra-live')?.scrollIntoView({behavior:'instant',block:'start'})") time.sleep(5) # widget fetches data page.screenshot(path=str(OUT/"03-infra-widget.png"), full_page=False) infra_data = page.evaluate("""() => ({ servers: document.getElementById('infra-servers')?.textContent, gpus: document.getElementById('infra-gpus')?.textContent, blade: document.getElementById('infra-blade')?.textContent, docker: document.getElementById('infra-docker')?.textContent, subdomains: document.getElementById('infra-subdomains')?.textContent, load: document.getElementById('infra-load')?.textContent, servers_list: document.getElementById('infra-servers-list')?.textContent, blade_info: document.getElementById('infra-blade-info')?.textContent, servers_detail_count: document.querySelectorAll('#infra-servers-detail div').length })""") results["tests"].append({"test":"infra_widget", "data":infra_data}) print(f" ✓ Infra widget: {infra_data}") # Test 4: Full page page.evaluate("window.scrollTo(0, 0)") time.sleep(2) page.screenshot(path=str(OUT/"04-wtp-full.png"), full_page=True) # Test 5: Zoom on infra page.evaluate("document.getElementById('wtp-infra-live')?.scrollIntoView({behavior:'smooth',block:'center'})") time.sleep(3) page.screenshot(path=str(OUT/"05-infra-centered.png"), full_page=False) ctx.close() browser.close() videos = list(OUT.glob("*.webm")) results["video"] = videos[0].name if videos else None pngs = list(OUT.glob("*.png")) results["screenshots"] = {p.name: p.stat().st_size for p in pngs} results["total_png_size"] = sum(p.stat().st_size for p in pngs) print(f"\n ✓ screenshots={len(pngs)} video={results['video']}") with open(OUT/"results.json","w") as f: json.dump(results, f, indent=2, default=str) print(json.dumps({"tests_passed": len([t for t in results["tests"] if "err" not in t]), "tests_failed": len([t for t in results["tests"] if "err" in t])}, indent=2)) except Exception as e: print(f"ERR: {e}")