// 🧪 Testsuite: HTML 04 - Accessibility & ARIA // TEST: Teilziel 1 - Skip-Link & Sprungziel const skipLink = doc.querySelector('a[href="#main-content"]'); assert.ok(skipLink, "Ein Skip-Link mit href=\"#main-content\" muss als Navigationshilfe existieren."); const mainTarget = doc.querySelector('main#main-content, #main-content'); assert.ok(mainTarget, "Das Sprungziel mit id=\"main-content\" (idealerweise das
-Element) muss vorhanden sein."); // TEST: Teilziel 2 - Icon-Button mit aria-label & aria-hidden const ariaLabelBtn = doc.querySelector('button[aria-label]'); assert.ok(ariaLabelBtn && ariaLabelBtn.getAttribute("aria-label").trim().length > 0, "Ein Button mit aussagekräftigem aria-label-Attribut ist erforderlich."); const ariaHiddenIcon = ariaLabelBtn ? ariaLabelBtn.querySelector('[aria-hidden="true"]') : doc.querySelector('[aria-hidden="true"]'); assert.ok(ariaHiddenIcon, "Das rein dekorative Icon im Button muss aria-hidden=\"true\" besitzen."); // TEST: Teilziel 3 - Aufklappbares Accordion mit aria-expanded & aria-controls const expandedBtn = doc.querySelector('button[aria-expanded][aria-controls]'); assert.ok(expandedBtn, "Ein Accordion-Button mit aria-expanded und aria-controls-Attributen muss existieren."); assert.ok(expandedBtn.getAttribute("aria-expanded") === "false" || expandedBtn.getAttribute("aria-expanded") === "true", "aria-expanded muss 'true' oder 'false' sein."); const controlledId = expandedBtn.getAttribute("aria-controls"); const controlledElement = doc.getElementById(controlledId); assert.ok(controlledElement, `Das durch aria-controls="${controlledId}" referenzierte Element muss im DOM existieren.`); // TEST: Teilziel 4 - Hilfetext-Verknüpfung via aria-describedby const describedInput = doc.querySelector('input[aria-describedby]'); assert.ok(describedInput, "Ein Eingabefeld mit aria-describedby-Attribut ist erforderlich."); const descId = describedInput.getAttribute("aria-describedby"); const descElement = doc.getElementById(descId); assert.ok(descElement && descElement.textContent.trim().length > 0, `Das durch aria-describedby="${descId}" verknüpfte Hinweistext-Element muss existieren.`); // TEST: Teilziel 5 - Live Region mit role="status" & aria-live="polite" const liveRegion = doc.querySelector('[role="status"], [aria-live]'); assert.ok(liveRegion, "Ein Live-Status-Bereich muss im Dokument definiert sein."); assert.strictEqual(liveRegion.getAttribute("aria-live") || (liveRegion.getAttribute("role") === "status" ? "polite" : ""), "polite", "Der Statusbereich muss aria-live=\"polite\" oder role=\"status\" nutzen.");