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

137 lines
6.8 KiB
Python

"""
WTP Playwright E2E FINAL session 19avr · all additions proved
- WTP home state
- V80 drawer 105 items
- V81 Orphans rescue section (new autre Opus)
- Infrastructure Live Widget (mon apport)
- Multi-agent chat SSE test
- Orphans-rescue.html page premium dark (V82)
"""
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/e2e-final-{TS}")
OUT.mkdir(parents=True, exist_ok=True)
results = {"ts": TS, "tests": [], "summary": {}}
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()
# === TEST 1: WTP home ===
page.goto(f"https://weval-consulting.com/weval-technology-platform.html?e2e={TS}", wait_until="networkidle", timeout=25000)
time.sleep(8)
page.screenshot(path=str(OUT/"01-wtp-home.png"), full_page=False)
home_kpis = page.evaluate("""() => ({
agents: document.getElementById('vm-gauge-agents')?.textContent?.replace(/\\s+/g,' ').trim(),
cov: document.getElementById('vm-gauge-cov')?.textContent?.replace(/\\s+/g,' ').trim(),
ethica: document.getElementById('vm-gauge-ethica')?.textContent?.replace(/\\s+/g,' ').trim(),
sovereign: document.getElementById('vm-gauge-sovereign')?.textContent?.replace(/\\s+/g,' ').trim(),
title: document.title
})""")
results["tests"].append({"test":"wtp_home", "data":home_kpis, "ok": "906" in (home_kpis.get("agents") or "")})
print(f" ✓ T1 WTP home: {home_kpis}")
# === TEST 2: V80 drawer + V81 orphans section ===
try:
page.click("#v80-toggle", timeout=3000)
time.sleep(4)
page.screenshot(path=str(OUT/"02-drawer-with-v81.png"), full_page=False)
drawer_data = page.evaluate("""() => ({
total_links: [...document.querySelectorAll('#v80-drawer a, #v80-drawer details')].length,
has_v81_section: !!document.querySelector('#v80-drawer details summary, [id*=v81], [class*=v81]'),
summary_text: [...document.querySelectorAll('#v80-drawer details summary')].map(s => s.textContent.trim().slice(0,60)).slice(0,5)
})""")
results["tests"].append({"test":"v80_drawer_v81", "data":drawer_data})
print(f" ✓ T2 Drawer + V81: {drawer_data}")
except Exception as e:
results["tests"].append({"test":"v80_drawer_v81", "err":str(e)[:100]})
# === TEST 3: Infrastructure Widget ===
page.keyboard.press("Escape")
time.sleep(2)
page.evaluate("document.getElementById('wtp-infra-live')?.scrollIntoView({behavior:'instant'})")
time.sleep(6) # widget fetch
page.screenshot(path=str(OUT/"03-infra-live.png"), full_page=False)
infra = page.evaluate("""() => ({
servers: document.getElementById('infra-servers')?.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,
blade_ip: document.getElementById('infra-blade-info')?.textContent,
servers_detail_count: document.querySelectorAll('#infra-servers-detail div').length
})""")
results["tests"].append({"test":"infra_widget", "data":infra, "ok": infra.get("blade") and "ONLINE" in infra.get("blade","")})
print(f" ✓ T3 Infra: {infra}")
# === TEST 4: Orphans-rescue.html V82 premium page ===
page.goto(f"https://weval-consulting.com/orphans-rescue.html?e2e={TS}", wait_until="networkidle", timeout=15000)
time.sleep(5)
page.screenshot(path=str(OUT/"04-orphans-rescue.png"), full_page=True)
orphans_data = page.evaluate("""() => ({
title: document.title,
body_text_len: document.body.innerText.length,
has_kpis: document.body.innerText.match(/\\d+\\s*orphelins|orphan/i) ? true : false
})""")
results["tests"].append({"test":"orphans_rescue_page", "data":orphans_data})
print(f" ✓ T4 Orphans page: {orphans_data}")
# === TEST 5: Multi-agent chat (via API direct · auth chat requires login) ===
import urllib.request
req = urllib.request.Request(
"https://weval-consulting.com/api/wevia-master-api.php?fast=1",
data=json.dumps({"message":"rescue orphelins"}).encode(),
headers={'Content-Type': 'application/json'},
method='POST'
)
try:
import ssl
r = urllib.request.urlopen(req, timeout=15, context=ssl._create_unverified_context())
d = json.loads(r.read().decode(errors='replace'))
results["tests"].append({"test":"chat_rescue_orphelins", "intent":d.get("intent"), "output_len":len(d.get("output",""))})
print(f" ✓ T5 Chat rescue: intent={d.get('intent')} · output_len={len(d.get('output',''))}")
except Exception as e:
results["tests"].append({"test":"chat_rescue_orphelins", "err":str(e)[:100]})
# === TEST 6: Truth Registry + Autonomy ===
try:
req = urllib.request.Request("https://weval-consulting.com/api/opus5-autonomy-kpi.php")
r = urllib.request.urlopen(req, timeout=8, context=ssl._create_unverified_context())
kpi = json.loads(r.read().decode())
results["tests"].append({"test":"autonomy_kpi", "data": kpi.get("truth")})
print(f" ✓ T6 Autonomy KPI: {kpi.get('truth')}")
except Exception as e:
results["tests"].append({"test":"autonomy_kpi", "err":str(e)[:100]})
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}
# Summary
passed = [t for t in results["tests"] if "err" not in t]
failed = [t for t in results["tests"] if "err" in t]
results["summary"] = {"passed": len(passed), "failed": len(failed), "total": len(results["tests"])}
with open(OUT/"results.json","w") as f:
json.dump(results, f, indent=2, default=str)
print(f"\n ✓ Summary: {results['summary']}")
print(f" ✓ Video: {results['video']}")
print(f" ✓ Screenshots: {len(pngs)}")
except Exception as e:
print(f"ERR: {e}")