Skip to content

Commit 543f625

Browse files
mariogregorclaude
andcommitted
fix: Scanner DOM-Konsistenz für SPAs (React/Vue) verbessern
- Page-Load nutzt domcontentloaded + 3s Hydration-Wait statt networkidle - Nach Responsive-Check wird die Seite neu geladen (Viewport-Änderungen können React-Re-Renders auslösen die den DOM verändern) - SEO-Check wartet 2s vor DOM-Analyse für vollständige SPA-Hydration - networkidle optional mit 15s Timeout (Websocket-Seiten werden nie idle) Behebt: Inkonsistente Ergebnisse wo axe-core h2 findet aber SEO-Check h1/main im selben Komponenten-Baum nicht erkennt. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent dfcb497 commit 543f625

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

utils/website_scanner.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,13 @@ def run(self):
176176
if self.login_url:
177177
self._perform_login(page)
178178

179-
page.goto(self.url, wait_until="networkidle", timeout=30000)
179+
page.goto(self.url, wait_until="domcontentloaded", timeout=60000)
180+
try:
181+
page.wait_for_load_state("networkidle", timeout=15000)
182+
except Exception:
183+
pass # Seiten mit Websockets/Polling werden nie "idle"
184+
# Warten auf SPA-Hydration (React, Vue, etc.)
185+
page.wait_for_timeout(3000)
180186

181187
# Falls kein separater Login-URL aber Credentials vorhanden:
182188
# prüfe ob auf der Zielseite ein Login-Formular ist
@@ -397,13 +403,18 @@ def _check_responsive(self, page, context, browser):
397403
viewport=vp["name"],
398404
)
399405

400-
# Viewport zurücksetzen
406+
# Viewport zurücksetzen und Seite neu laden für sauberen DOM-State
401407
page.set_viewport_size({"width": 1440, "height": 900})
408+
page.reload(wait_until="domcontentloaded")
409+
page.wait_for_timeout(2000)
402410

403411
# ------------------------------------------------------------------
404412
# SEO
405413
# ------------------------------------------------------------------
406414
def _check_seo(self, page, context, browser):
415+
# Sicherstellen dass SPA-Frameworks (React etc.) fertig gemountet haben
416+
page.wait_for_load_state("domcontentloaded")
417+
page.wait_for_timeout(2000)
407418
seo = page.evaluate("""() => {
408419
const meta = (name) => {
409420
const el = document.querySelector(`meta[name="${name}"], meta[property="${name}"]`);

0 commit comments

Comments
 (0)