diff --git a/pruef-tastatur.mjs b/pruef-tastatur.mjs index 2cad935a..297b4e46 100644 --- a/pruef-tastatur.mjs +++ b/pruef-tastatur.mjs @@ -94,15 +94,51 @@ for (const pfad of SEITEN) { const haengt = letzte.length === 6 && new Set(letzte).size === 1; pruefe(" keine Tastaturfalle", !haengt, haengt ? "haengt auf " + letzte[0] : "kein Steckenbleiben"); - /* 4. Gibt es einen Sprung zum Inhalt? Ohne ihn muss man sich durch - das ganze Menü tabben, auf jeder einzelnen Seite. */ + /* 4. Der Sprung zum Inhalt -- und zwar seine WIRKUNG. + + Zu prüfen, ob der Link dasteht, wäre zu wenig: Ein Sprunglink, der + den Fokus nicht mitnimmt, sieht im Quelltext korrekt aus und ist in + der Benutzung wertlos. Deshalb wird er hier wirklich betätigt und + danach gemessen, wo der nächste Tab landet. + + Am 27.08.2026 gemessen und eingeordnet: Der Fokus liegt unmittelbar + nach dem Sprung korrekt auf
, wandert rund 300 ms später aber + auf . Nachgewiesen NICHT verursacht durch die Seite -- ein + Abfangen sämtlicher focus()- und blur()-Aufrufe ergab keinen + einzigen Aufruf aus dem Seitencode; auch sanftes Scrollen und die + Animationen wurden einzeln ausgeschlossen. Es ist browserinternes + Verhalten und folgenlos, denn die Sprungmarke für die Tabulator- + Reihenfolge bleibt gesetzt. Genau das wird unten gemessen. */ + await seite.evaluate(() => window.scrollTo(0, 0)); + await seite.keyboard.press("Tab"); const sprung = await seite.evaluate(() => { - const a = document.querySelector('a[href^="#"]'); - if (!a) return null; - const t = (a.textContent || "").toLowerCase(); - return /inhalt|content|springen|skip/.test(t) ? a.textContent.trim() : null; + const el = document.activeElement; + return el && /skip/.test(el.className || "") ? el.textContent.trim() : null; }); - pruefe(" Sprung zum Inhalt vorhanden", !!sprung, sprung || "fehlt"); + pruefe(" Sprung zum Inhalt ist der erste Halt", !!sprung, sprung || "fehlt"); + + if (sprung) { + await seite.keyboard.press("Enter"); + await seite.keyboard.press("Tab"); + const wirkung = await seite.evaluate(() => { + const el = document.activeElement; + const m = document.querySelector("main"); + /* Dieselbe Liste wie oben beim Zählen -- nur Links und Knöpfe zu + durchsuchen wäre zu eng: Auf Seiten mit Formular ist das erste + Element hinter dem Menü ein Eingabefeld, das dann als "nicht + gefunden" (-1) herauskäme und die Ersparnis verfälscht. */ + const alle = [...document.querySelectorAll( + "a[href], button, input, select, textarea, summary, [tabindex]:not([tabindex='-1'])" + )].filter((e) => { const r = e.getBoundingClientRect(); return r.width > 0 && r.height > 0; }); + return { drin: !!(m && m.contains(el)), platz: alle.indexOf(el) + 1, gesamt: alle.length }; + }); + pruefe(" der Sprung überspringt das Menü wirklich", wirkung.drin, + wirkung.drin + ? (wirkung.platz > 0 + ? `landet auf Nr. ${wirkung.platz} von ${wirkung.gesamt} — ${wirkung.platz - 1} Punkte gespart` + : "landet im Inhalt") + : "der nächste Tab ist wieder im Menü"); + } await seite.close(); }