151 lines
6.4 KiB
Python
151 lines
6.4 KiB
Python
#!/usr/bin/env python3
|
|
"""L99 MEGA TEST — ALL PAGES + SCREENSHOTS + SCENARIOS"""
|
|
import json,time,os
|
|
from playwright.sync_api import sync_playwright
|
|
|
|
BASE="https://weval-consulting.com"
|
|
SSDIR="/var/www/html/test-report/screenshots"
|
|
os.makedirs(SSDIR,exist_ok=True)
|
|
|
|
PAGES=[
|
|
"index.html","login.html","register.html","cgu.html","booking.html","case-studies.html",
|
|
"admin.html","admin-v2.html","admin-saas.html",
|
|
"agents-archi.html","agents-fleet.html","agents-goodjob.html",
|
|
"ai-benchmark.html","architecture.html","apps.html",
|
|
"blade-ai.html","blade-center.html","blade-install.html",
|
|
"claude-monitor.html","claw-chat.html","claw-code.html",
|
|
"command-center.html","crons-monitor.html",
|
|
"director.html","director-center.html","director-chat.html",
|
|
"enterprise-model.html","enterprise-management.html",
|
|
"l99.html","l99-brain.html","l99-saas.html",
|
|
"monitoring.html","mega-command-center.html",
|
|
"openclaw.html","oss-discovery.html",
|
|
"paperclip.html","value-streaming.html",
|
|
"wevia.html","wevia-master.html","wevia-console.html","wevia-meeting-rooms.html",
|
|
"wevia-widget.html","weval-login.html",
|
|
]
|
|
SUBS=["crm","paperclip","langfuse","deerflow","analytics","mm","monitor","n8n","git"]
|
|
APIS=["/api/nonreg-api.php?cat=all","/api/wevia-master-autoheal.php","/api/wevia-deep-test.php",
|
|
"/api/ecosystem-health.php","/api/openclaw-proxy.php","/api/architecture-index.json"]
|
|
|
|
results={"pages":[],"subs":[],"apis":[],"scenarios":[],"summary":{}}
|
|
t0=time.time()
|
|
|
|
with sync_playwright() as p:
|
|
browser=p.chromium.launch(headless=True,args=["--no-sandbox","--ignore-certificate-errors"])
|
|
ctx=browser.new_context(ignore_https_errors=True,
|
|
record_video_dir="/var/www/html/test-report/videos",
|
|
record_video_size={"width":1280,"height":720})
|
|
|
|
# PHASE 1: ALL PAGES
|
|
print(f"PHASE 1: {len(PAGES)} pages")
|
|
for pg in PAGES:
|
|
page=ctx.new_page()
|
|
js_errs=[]
|
|
page.on("pageerror",lambda e:js_errs.append(str(e)[:80]))
|
|
try:
|
|
r=page.goto(f"{BASE}/{pg}",wait_until="networkidle",timeout=15000)
|
|
status=r.status if r else 0
|
|
size=len(page.content())
|
|
title=page.title()[:40]
|
|
ss=pg.replace(".html","")+".png"
|
|
page.screenshot(path=f"{SSDIR}/{ss}")
|
|
ok=(status in[200,302])and size>500
|
|
results["pages"].append({"page":pg,"status":status,"size":size,"title":title,"jsErrors":len(js_errs),"errors":js_errs[:3],"screenshot":ss,"pass":ok})
|
|
print(f" {'V' if ok else 'X'} {pg} {status} {size}b {len(js_errs)}err")
|
|
except Exception as e:
|
|
results["pages"].append({"page":pg,"status":0,"error":str(e)[:60],"pass":False})
|
|
print(f" X {pg} TIMEOUT")
|
|
page.close()
|
|
|
|
# PHASE 2: SUBDOMAINS
|
|
print(f"PHASE 2: {len(SUBS)} subs")
|
|
for sub in SUBS:
|
|
page=ctx.new_page()
|
|
try:
|
|
r=page.goto(f"https://{sub}.weval-consulting.com/",wait_until="networkidle",timeout=10000)
|
|
ok=r and r.status in[200,302]
|
|
results["subs"].append({"sub":sub,"status":r.status if r else 0,"pass":ok})
|
|
print(f" {'V' if ok else 'X'} {sub} {r.status if r else 0}")
|
|
except:
|
|
results["subs"].append({"sub":sub,"status":0,"pass":False})
|
|
print(f" X {sub} TIMEOUT")
|
|
page.close()
|
|
|
|
# PHASE 3: APIs
|
|
print(f"PHASE 3: {len(APIS)} APIs")
|
|
for api in APIS:
|
|
page=ctx.new_page()
|
|
try:
|
|
r=page.goto(f"{BASE}{api}",wait_until="networkidle",timeout=10000)
|
|
body=page.content()
|
|
ok=r and r.status==200 and "{" in body
|
|
results["apis"].append({"api":api,"status":r.status if r else 0,"pass":ok})
|
|
print(f" {'V' if ok else 'X'} {api} {r.status if r else 0}")
|
|
except:
|
|
results["apis"].append({"api":api,"status":0,"pass":False})
|
|
print(f" X {api}")
|
|
page.close()
|
|
|
|
# PHASE 4: SCENARIOS
|
|
print("PHASE 4: Business scenarios")
|
|
scenarios=[
|
|
("Login form","login.html","input"),
|
|
("WEVIA chat","wevia.html",None),
|
|
("OpenClaw providers","openclaw.html","Groq"),
|
|
("Architecture data","architecture.html","score"),
|
|
("Enterprise model","enterprise-model.html",None),
|
|
("OSS tools","oss-discovery.html","skill"),
|
|
]
|
|
for name,pg,check in scenarios:
|
|
page=ctx.new_page()
|
|
try:
|
|
page.goto(f"{BASE}/{pg}",wait_until="networkidle",timeout=15000)
|
|
body=page.content()
|
|
if check=="input": ok=bool(page.query_selector("input"))
|
|
elif check: ok=check.lower() in body.lower()
|
|
else: ok=len(body)>5000
|
|
page.screenshot(path=f"{SSDIR}/scenario-{pg.replace('.html','')}.png")
|
|
results["scenarios"].append({"name":name,"pass":ok})
|
|
print(f" {'V' if ok else 'X'} {name}")
|
|
except:
|
|
results["scenarios"].append({"name":name,"pass":False})
|
|
print(f" X {name}")
|
|
page.close()
|
|
|
|
ctx.close()
|
|
browser.close()
|
|
|
|
# SUMMARY
|
|
pp=sum(1 for p in results["pages"] if p["pass"])
|
|
sp=sum(1 for s in results["subs"] if s["pass"])
|
|
ap=sum(1 for a in results["apis"] if a["pass"])
|
|
sc=sum(1 for s in results["scenarios"] if s["pass"])
|
|
total=len(results["pages"])+len(results["subs"])+len(results["apis"])+len(results["scenarios"])
|
|
tp=pp+sp+ap+sc
|
|
|
|
results["summary"]={
|
|
"ts":time.strftime("%Y-%m-%dT%H:%M:%S"),
|
|
"elapsed":round(time.time()-t0),
|
|
"pages":f"{pp}/{len(results['pages'])}",
|
|
"subs":f"{sp}/{len(results['subs'])}",
|
|
"apis":f"{ap}/{len(results['apis'])}",
|
|
"scenarios":f"{sc}/{len(results['scenarios'])}",
|
|
"total":f"{tp}/{total}",
|
|
"pct":round(100*tp/total) if total else 0,
|
|
"jsErrorPages":[p["page"] for p in results["pages"] if p.get("jsErrors",0)>0],
|
|
"failedPages":[p["page"] for p in results["pages"] if not p["pass"]],
|
|
"screenshots":SSDIR,
|
|
"videos":"/var/www/html/test-report/videos"
|
|
}
|
|
json.dump(results,open("/var/www/html/test-report/l99-mega-results.json","w"),indent=2)
|
|
|
|
print(f"\nPAGES: {results['summary']['pages']}")
|
|
print(f"SUBS: {results['summary']['subs']}")
|
|
print(f"APIs: {results['summary']['apis']}")
|
|
print(f"SCENARIOS: {results['summary']['scenarios']}")
|
|
print(f"TOTAL: {results['summary']['total']} ({results['summary']['pct']}%)")
|
|
print(f"JS ERRORS: {', '.join(results['summary']['jsErrorPages']) or 'none'}")
|
|
print(f"FAILED: {', '.join(results['summary']['failedPages']) or 'none'}")
|
|
print(f"TIME: {results['summary']['elapsed']}s")
|