Test with screen readers
Pages must be tested with actual screen reader software (NVDA, JAWS, VoiceOver, TalkBack) to verify announcements, focus order, and widget behavior beyond what automated tools can detect.
- Automated tools catch ~30-40% of accessibility issues — screen reader testing finds the rest
- Test with NVDA + Chrome or Firefox on Windows; JAWS + Chrome on Windows; VoiceOver + Safari on macOS/iOS; TalkBack + Chrome on Android
- Verify: all interactive elements are reachable by keyboard, announced correctly, and operable
- Check dynamic content: live regions (`aria-live`), modal dialogs (focus trap), and custom widgets (menus, tabs, trees)
- Test real user flows: form completion, navigation to a destination, error correction
Rule Details
Automated accessibility testing catches structural issues in the accessibility tree, but cannot verify whether a page is actually usable by someone relying on a screen reader. WebAIM's testing guide (opens in new tab), the NVDA user guide (opens in new tab), and the VoiceOver guide (opens in new tab) all assume real assistive tech is part of the review, not an optional extra.
Code Example
Screen reader test checklist:
- Open the page in a screen reader such as NVDA, VoiceOver, or JAWS
- Navigate the primary flow using headings, landmarks, and form controls
- Confirm names, roles, states, and announcements are understandableWhy It Matters
The ARIA Authoring Practices Guide (opens in new tab) is useful for expected widget behavior, but only a real screen reader session can tell you whether that implementation is actually announced and navigable in context.
- Automation Gap: Tools like axe-core find structural violations but cannot test whether the actual user experience is meaningful.
- Cognitive Load: Even technically valid ARIA implementations can produce confusing announcement sequences — only human testing reveals this.
- Interaction Modes: Screen readers switch between browse mode and application mode; widgets that work visually may fail in application mode.
- Real User Validation: Testing with an actual or simulated screen reader user provides actionable evidence of actual barriers.
Screen Reader / Browser Pairings
| Screen Reader | Best Browser | Platform | Market Share (est.) |
|---|---|---|---|
| JAWS | Chrome, Edge | Windows | ~40% |
| NVDA | Chrome, Firefox | Windows | ~41% |
| VoiceOver | Safari | macOS, iOS | ~10% desktop, ~70% mobile iOS |
| TalkBack | Chrome | Android | Most Android users |
| Narrator | Edge | Windows | Small but growing |
Test with at least NVDA + Chrome and VoiceOver + Safari to cover the two largest populations.
Core Testing Checklist
Navigation
- All content reachable by Tab key alone
- Heading structure makes sense when navigating by headings (H key in NVDA/JAWS)
- Landmarks are present and labeled (
<main>,<nav>,<header>) - Skip link works and moves focus to main content
Interactive Elements
- Every button, link, and form field announced with name + role + state
- Custom widgets (tabs, menus, trees, dialogs) follow arrow-key navigation patterns
- Toggle buttons announce their current state (aria-pressed, aria-expanded)
Forms
- Each input announced with its label when focused
- Required fields announced as required (aria-required="true")
- Inline validation errors associated with their field (aria-describedby)
- Form submission errors cause focus to move to error summary
Dynamic Content
- Loading states announced without disrupting reading flow
- Success/error messages announced (aria-live regions)
- Modal dialogs trap focus and return it on close
- Infinite scroll or lazy-loaded content is reachable
Exceptions
- Evaluate the rendered experience before treating a static-code smell as a blocker; interaction timing, browser behavior, and assistive technology output often determine severity.
- Not every secondary accessibility issue deserves equal weight; prioritize the issue that most directly blocks perception, operation, or understanding.
- Avoid adding redundant markup or ARIA solely to satisfy a rule when a simpler semantic implementation would eliminate the issue entirely.
Standards
- Align the implementation with WebAIM: Using Screen Readers for Testing and verify the rendered experience, not only the source code.
- Align the implementation with NVDA User Guide and verify the rendered experience, not only the source code.
- Align the implementation with Apple: VoiceOver User Guide (macOS) and verify the rendered experience, not only the source code.
Verification
Automated Checks
- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.
- Run an automated accessibility checker such as axe or Lighthouse where applicable.
Manual Checks
- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.
- Re-test one representative user flow with a screen reader if this rule affects a key interaction.
Use with AI
Copy these prompts to use with your AI assistant, or install the MCP server to use directly from Claude, Cursor, or Windsurf.
Check
Verify implementation
Test the page with at least two screen reader / browser combinations: (1) NVDA + Chrome (Windows) or VoiceOver + Safari (macOS). Navigate using only the keyboard: Tab for focusable elements, arrow keys for widgets, heading navigation (H key in NVDA/JAWS), landmark navigation (D/R keys), and links list (NVDA: Insert+F7). Verify: all interactive elements are reachable and announced with name + role + state; custom widgets (menus, tabs, dialogs) follow ARIA Authoring Practices Guide keyboard patterns; dynamic updates are announced via live regions; focus is managed correctly when modals open and close.
Fix
Auto-fix issues
Common issues and fixes: (1) Missing accessible names — add aria-label or associate <label> elements. (2) Wrong reading order — reorder DOM structure to match visual order; use CSS for visual reordering only. (3) Focus lost after modal closes — return focus to the trigger element. (4) Dynamic content not announced — add aria-live='polite' (non-critical) or aria-live='assertive' (critical alerts) to containers. (5) Custom widget not keyboard operable — implement ARIA APG keyboard patterns (roving tabindex for menus, arrow keys for tabs). (6) Form errors not announced — associate error messages via aria-describedby or use aria-live regions.
Explain
Learn more
Screen readers convert web content to audio or braille output. They build their understanding of a page from the accessibility tree — a parallel representation of the DOM constructed from HTML semantics and ARIA attributes. Automated tools check the tree structure for known violations, but cannot verify whether a blind user can actually complete a task. Screen reader testing requires navigating with real screen reader commands: reading mode (virtual cursor) for browsing content, forms/application mode for interacting with widgets, and shortcut keys for headings, landmarks, and links. Each screen reader + browser combination has unique behavior quirks.
Review
Code review
Review the rendered markup and interactive states that affect Test with screen readers. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.