Storybook Accessibility Testing

Der Befund fällt schon in der Story auf

Icon-Button und verborgene Karte: zwei Befunde je Komponente.

Website prüfen
Beispiel im Prüfbericht Markierter Befund
Markierter Befund · Kritisch · WCAG 4.1.2Tauschen-Button ohne Namen

Story-Testlabor

Stories werden zu Prüfständen

Jede Story friert einen Zustand ein. axe prüft den gerenderten DOM, play durchläuft Verhalten und Vitest trägt den Befund bis in die CI.

Ein Befund, direkt an der Komponente

Konzeptionelle Storybook-Ansicht. Die Oberfläche zeigt den typischen Weg von der Story zum markierten Element; Bezeichnungen und Anordnung können je nach Storybook-Version variieren.

Die Prüfkette hat vier getrennte Aufgaben

Drei Ebenen statt eines grünen Häkchens

Automatischaxe am gerenderten DOM

Namen, Rollen, ARIA-Beziehungen und viele Kontrastfehler.

Interaktionplay in der Story

Öffnen, tippen, tabben und den erwarteten Zustand prüfen.

ManuellTastatur und Vorleseprogramm

Bedienlogik, verständliche Ansagen und „Incomplete“-Fälle beurteilen.

Ein fehlerfreier axe-Lauf ist ein technisches Signal. Er belegt nicht, dass die Komponente insgesamt verständlich oder in jedem Zustand bedienbar ist.

Der aktuelle kurze Setup-Pfad

npx storybook add @storybook/addon-a11y
npx storybook add @storybook/addon-vitest

Der erste Befehl installiert und konfiguriert das Accessibility-Addon. Der zweite richtet bei einem Vite-basierten Storybook den Browser-Testlauf mit Vitest ein.

Vite oder Next.jsVitest-Addon: Tests in Storybook, CLI und CI.
Anderes FrameworkStorybook test-runner als dokumentierte Alternative.

Fehler projektweit aktivieren

// .storybook/preview.js
const preview = {
  parameters: {
    a11y: {
      test: 'error',
    },
  },
};

export default preview;

error macht Verstöße zu fehlgeschlagenen Tests. todo zeigt sie lokal als Warnung, blockiert die CI aber nicht. off schaltet den automatischen Test für die Story aus.

Zustände und Tastaturweg in einer Story-Datei

Feste args geben axe reproduzierbare Zustände. Die play-Funktion prüft zusätzlich, ob der benannte Auslöser per Tastatur erreichbar ist.

  • MitName: stabile DOM-Momentaufnahme für axe.
  • Tastatur: Fokus und Enter-Verhalten als Interaktionstest.
  • OhneName: nur als bewusste Fehler-Story mit todo.
// IconButton.stories.js
import { expect, fn } from 'storybook/test';
import { IconButton } from './IconButton';

export default {
  component: IconButton,
  parameters: { a11y: { test: 'error' } },
};

export const MitName = {
  args: { label: 'Schließen' },
};

export const Tastatur = {
  args: { label: 'Schließen', onClick: fn() },
  play: async ({ args, canvas, userEvent }) => {
    const knopf = canvas.getByRole('button', {
      name: 'Schließen',
    });

    await userEvent.tab();
    await expect(knopf).toHaveFocus();
    await userEvent.keyboard('{Enter}');
    await expect(args.onClick).toHaveBeenCalled();
  },
};

export const OhneName = {
  args: { label: '' },
  parameters: { a11y: { test: 'todo' } },
};

So prüfen Sie es

  1. Öffnen Sie jede relevante Zustands-Story. Prüfen Sie im Bereich Accessibility die Gruppen Violations, Passes und Incomplete.
  2. Markieren Sie einen Verstoß und prüfen Sie das hervorgehobene Element im gerenderten Canvas. Korrigieren Sie die Komponente, nicht nur die Story-Dekoration.
  3. Führen Sie die Komponententests mit aktivierter Accessibility-Option aus. Eine Story mit test: 'error' muss bei einem axe-Verstoß in UI und CI fehlschlagen.
  4. Gehen Sie die Story danach mit Tab, Enter, Leertaste und einem Vorleseprogramm durch. Bearbeiten Sie alle „Incomplete“-Fälle als echte Prüfaufgaben.

Aus dem Prüfbericht

Zwei Befunde an der Komponente

Zum Mitnehmen

Die Komponente, korrigiert

Ein aria-label, ein entferntes Attribut, ein strenger Testlauf.

Korrektur in 3 Schritten ansehen
  1. Dem Icon-Button einen Namen geben

    Das Symbol bleibt für Vorleseprogramme verborgen. aria-label liefert stattdessen das Wort, das den Button benennt.

    KorrekturvergleichSchritt 1 · HTML

    Vorher

    <button class="icon-button" type="button">
      <svg aria-hidden="true"><use href="#icon-schliessen"></use></svg>
    </button>

    Nachher

    <button class="icon-button" type="button" aria-label="Schließen">
      <svg aria-hidden="true"><use href="#icon-schliessen"></use></svg>
    </button>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Tabben Sie in der Story auf den Button. Ein Vorleseprogramm sagt „Schließen, Schaltfläche“.

  2. Das aria-hidden am Wrapper entfernen

    aria-hidden nimmt den Bereich aus der Ausgabe, lässt den Link aber in der Tabreihenfolge. Beides zusammen widerspricht sich.

    KorrekturvergleichSchritt 2 · HTML

    Vorher

    <div class="karte" aria-hidden="true">
      <a href="/details">Details ansehen</a>
    </div>

    Nachher

    <div class="karte">
      <a href="/details">Details ansehen</a>
    </div>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Tabben Sie auf den Link. Ein Vorleseprogramm nennt ihn jetzt beim Namen.

  3. Den Befund im Testlauf festhalten

    Mit der Stufe error bricht der Lauf ab, sobald eine Story einen Befund hat. So bleibt die Korrektur bestehen.

    KorrekturvergleichSchritt 3 · JavaScript

    Vorher

    export const Standard = {
      args: { label: '' },
    };

    Nachher

    export const Standard = {
      args: { label: 'Schließen' },
      parameters: { a11y: { test: 'error' } },
    };

    Markierte Zeilen wurden geändert

    So prüfen Sie es Starten Sie den Testlauf. Er endet mit einem Fehler, solange ein Button namenlos ist.

Werbung

Kostenloser Website-Barrierefreiheits-Check

Website auf Barrierefreiheit prüfen.

Technische WCAG-Warnsignale erkennen. Kritische Stellen zuerst prüfen.

Der Website-Check ist bereit.

Werbung

Ein letzter Schritt

Prüfen, bevor Sie gehen.

Finden Sie automatisch erkennbare Barrieren auf Ihrer eigenen Website.

Website prüfen

Kostenlos starten · keine Installation

Automatisches Screening. Tastaturbedienung und Screenreader bleiben manuelle Prüfung.