#!/opt/fluchtplan/venv/bin/python
"""Testseite in Chromium (Playwright) ausführen, Ergebnis und Seitenfehler ausgeben.
Aufruf: lauf.py <testseite.html> [--breite 360] [--zeit 120] [--bild datei.png]"""
import argparse, subprocess, sys, time, urllib.request
from playwright.sync_api import sync_playwright
ap = argparse.ArgumentParser(); ap.add_argument('seite'); ap.add_argument('--breite', type=int, default=360); ap.add_argument('--zeit', type=int, default=120); ap.add_argument('--bild')
a = ap.parse_args()
PORT = 8765
try: urllib.request.urlopen(f'http://127.0.0.1:{PORT}/', timeout=2)
except Exception:
    subprocess.Popen([sys.executable, '-m', 'http.server', str(PORT), '--bind', '127.0.0.1'], cwd='/opt/sifa-ablauf/tests', stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL); time.sleep(1)
fehler = []
with sync_playwright() as p:
    b = p.chromium.launch(args=['--no-sandbox'])
    s = b.new_page(viewport={'width': a.breite, 'height': 900})
    s.on('pageerror', lambda e: fehler.append(f'Seitenfehler: {e}'))
    s.on('console', lambda m: fehler.append(f'Konsole {m.type}: {m.text}') if m.type in ('error',) else None)
    s.goto(f'http://127.0.0.1:{PORT}/{a.seite}')
    ende = time.time() + a.zeit; text = ''
    while time.time() < ende:
        text = s.evaluate("document.getElementById('ergebnis')?.textContent || ''")
        if 'ENDE' in text or 'ABBRUCH' in text: break
        time.sleep(0.5)
    if a.bild: s.screenshot(path=a.bild, full_page=False)
    b.close()
zeilen = text.splitlines()
print('\n'.join(z for z in zeilen if not z.startswith('OK')) or 'alle OK')
print(sum(z.startswith('OK') for z in zeilen), 'OK von', len(zeilen), '' if ('ENDE' in text or 'ABBRUCH' in text) else '(Zeit abgelaufen)')
for f in fehler[:15]: print(f)
