Skip to main content
Beta: Front-End Checklist is currently in beta. Some issues are still being fixed. Thanks for your patience.

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.

Utilities
Quick take
Typical fix time 60 min
  • 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
Why it matters: Screen readers are the primary interface for blind users and many users with severe low vision or motor disabilities. Automated accessibility scanners cannot detect incorrect announcements, wrong reading order, missing context, focus traps, or broken keyboard interactions. A page that passes automated checks can still be completely unusable by a screen reader user. Manual screen reader testing with representative tasks is the only way to verify real usability for this population.

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 understandable

Why 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 ReaderBest BrowserPlatformMarket Share (est.)
JAWSChrome, EdgeWindows~40%
NVDAChrome, FirefoxWindows~41%
VoiceOverSafarimacOS, iOS~10% desktop, ~70% mobile iOS
TalkBackChromeAndroidMost Android users
NarratorEdgeWindowsSmall but growing

Test with at least NVDA + Chrome and VoiceOver + Safari to cover the two largest populations.

Core Testing Checklist

  • 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.

Sources

References used to support the guidance in this rule.

Further Reading

Tools and supplementary material for exploring the topic in more depth.

axe DevTools
deque.comTool

Rules that often go hand-in-hand with this one.

Enable keyboard navigation for all elements

All interactive elements are accessible via keyboard with logical focus order and hidden elements excluded from tab sequence.

Accessibility
Announce dynamic content with ARIA live regions

Dynamic content updates are announced to screen readers using appropriate ARIA live regions.

Accessibility
Use unique IDs for active elements

All focusable or active elements must have a unique ID attribute.

Accessibility
Provide accessible names for tree items

All elements with role="treeitem" must have a descriptive accessible name so screen reader users can navigate hierarchical tree widgets.

Accessibility

Was this rule helpful?

Your feedback helps improve rule quality. This stays internal for now.

Loading feedback...
0 / 385