Field guide · manual testing
Screen reader testing guide
Testing with a real screen reader, ideally with disabled testers, is the gold standard for accessibility validation. Nothing automated replaces it. Here's how to run that pass, and where automated tooling clears the deterministic issues first.
Last reviewed 26 September 2026
On this page
Screen readers to use
- VoiceOvermacOS / iOSFree
System Settings → Accessibility → VoiceOver, or press Cmd+F5.
Key commands. VO keys = Ctrl+Option. Navigate: VO+Right Arrow. Activate: VO+Space.
- NVDAWindowsFree
Download from nvaccess.org, install, then Caps Lock or Insert is the modifier key.
Key commands. Navigate: Tab / arrow keys. Read the page: NVDA+Down Arrow. Elements list: NVDA+F7.
- JAWSWindows
Licensed software from Freedom Scientific: the tool most enterprise audits still expect.
Key commands. Navigate: Tab / arrow keys. Virtual cursor links list: Insert+F7.
What to check
- Page title is announced correctly
It's the first thing a screen reader user hears, and it has to identify the page.
- Headings create a navigable outline
Users jump between headings to scan a page the way a sighted user scans visually.
- Images are described or skipped
A meaningful image needs alt text; a decorative one should be hidden from the tree.
- Forms are labeled, errors are announced
A user needs to know what a field is for, and what went wrong when it fails.
- Links and buttons have descriptive text
"Click here" is meaningless once it's pulled out of context in a links list.
- Dynamic content is announced
Toasts, alerts, and live updates need an aria-live region or they pass silently.
- Focus is managed in modals
Opening a modal has to move focus in; closing it has to return focus to where it left.
- Tables have real headers
A screen reader uses <th> to announce the row/column context for each cell.
Clear the automatable issues first
Personaudit does not simulate a screen reader user. It drives a site keyboard-only and runs axe-core at every state it reaches, including flows behind a saved login, so the deterministic violations are cleared before a manual screen-reader pass. It complements that pass; it never replaces it.