Screen reader testing

A screen reader tells you what your markup actually communicates, which is regularly not what you meant it to. It is the only way to verify names, roles, states, structure and announcements — the substance of 1.3.1, 2.4.4, 4.1.2 and 4.1.3.

You are not simulating a blind user

You are inspecting your markup through the same interface a blind user has. A daily screen reader user runs at speech rates you would find unintelligible, knows dozens of shortcuts, and will navigate your page in ways you never try. Use the tool to find defects; do not use your experience of it to judge whether the page is usable. That judgement needs actual users.

Which one to test with

Screen readers, platforms and cost
Screen readerPlatformCostPair it with
NVDAWindowsFreeFirefox or Chrome
JAWSWindowsCommercialChrome
VoiceOvermacOS, iOSBuilt inSafari
TalkBackAndroidBuilt inChrome
NarratorWindowsBuilt inEdge

If you test with one, make it NVDA with Firefox on Windows or VoiceOver with Safari on macOS. Screen reader and browser behave as a pair — a bug in one combination may not appear in another, which is why real audits sample more than one.

NVDA (Windows)

The NVDA key is Insert (or Caps Lock in laptop layout). Start and stop with Ctrl+Alt+N. Silence it instantly with Ctrl.

NVDA commands you will use constantly
KeysWhat it does
CtrlStop speaking. Learn this first.
NVDA+Read continuously from here
H / Shift+HNext / previous heading
16Next heading at that level
DNext landmark
FNext form field
TNext table
GNext graphic
KNext link
NVDA+F7Elements list — every link, heading and landmark. The single most useful command for auditing.
NVDA+TabAnnounce the currently focused control
NVDA+TRead the page title

VoiceOver (macOS)

Toggle with Cmd+F5. The VO keys are Ctrl+Option. Turn on keyboard navigation in System Settings first, or Tab will skip links.

VoiceOver commands
KeysWhat it does
CtrlStop speaking
VO+ARead from here
VO+ / Next / previous item
VO+URotor — lists headings, links, landmarks, form controls. The equivalent of NVDA's elements list.
VO+Cmd+HNext heading
VO+Cmd+LNext link
VO+SpaceActivate the current item
VO+Shift+Interact with a group (tables, custom widgets)

Mobile: VoiceOver on iOS and TalkBack on Android

Test mobile separately. Touch targets (2.5.8), gestures (2.5.1), dragging (2.5.7) and orientation (1.3.4) can only be judged on a real device.

The test script

  1. Load the page and listen to the first thing announced. It should be a descriptive page title. 2.4.2
  2. Open the elements list or rotor and read the HEADINGS alone. They should work as a table of contents. 1.3.1 2.4.6
  3. Read the LINKS alone. Every entry should make sense out of context. Look for repeated "Read more" and bare URLs. 2.4.4 2.4.9
  4. Read the LANDMARKS. There should be a main, and the page should be navigable by region. 1.3.1 2.4.1
  5. Read the whole page top to bottom. Does the order make sense? Are images described usefully, or is a file name read out? 1.1.1 1.3.2
  6. Tab through every control and listen to name, role and state. "Marketing emails, toggle button, pressed" is right; "button" is not. 4.1.2
  7. Operate every custom widget. Does the announced state change when the visual state does? 4.1.2
  8. Trigger every status message — search results, add to basket, save confirmations, loading states. If you hear nothing, there is no live region. 4.1.3
  9. Submit a form with errors and listen. The error must be announced and tied to its field. 3.3.1
  10. Read a data table. Each cell should be announced with its row and column headers. 1.3.1

Mistakes sighted testers make

Practise on these demos