Files
weval-l99/pw-wtp-infra.py
2026-04-19 18:05:32 +02:00

98 lines
4.5 KiB
Python

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