Testing with a screen reader: NVDA and VoiceOver basics

Start a screen reader, learn the handful of commands you need, and know what to listen for when you test.

  • Beginner
  • 6 min read
  • Updated 17 Oct 2026

What you will learn

  • Navigate a page with a screen reader
  • Spot missing names and roles
  • Understand browse mode and focus mode

Before you start

Automated tools tell you whether a name exists. A screen reader tells you what a blind user actually hears. Testing with one is the most direct way to check names, roles, states, reading order and announcements.

You do not need to be an expert user. A small set of commands covers most testing. Remember that experienced screen reader users are much faster and use many more shortcuts, so a page that is merely tolerable to you may still be hard for them, and the reverse.

Which screen reader and browser

Test with combinations that people really use. WebAIM's screen reader user surveys consistently show NVDA and JAWS as the most used on desktop, and VoiceOver dominating on iPhone.

Screen readerPlatformCostTest with
NVDAWindowsFreeFirefox or Chrome
JAWSWindowsPaid, with a time-limited demo modeChrome or Edge
VoiceOvermacOS, iOS, iPadOSBuilt inSafari
TalkBackAndroidBuilt inChrome
NarratorWindowsBuilt inEdge

Start with one desktop pair, such as NVDA with Firefox or VoiceOver with Safari, and VoiceOver on an iPhone for mobile.

Turn on a visual output so you can see what is announced. NVDA has a Speech viewer in its Tools menu. VoiceOver shows a caption panel by default. You can then test with the sound low and read the output.

NVDA basics

Download NVDA from nvaccess.org and install it. The NVDA key is Insert by default; you can also set Caps Lock in the keyboard settings, which is easier on laptops.

ActionKeys
Start NVDACtrl+Alt+N
Stop speakingCtrl
Read from hereNVDA+Down Arrow
Next / previous itemDown Arrow / Up Arrow
Next heading / heading level 2H / 2
Next landmarkD
Next form field / button / linkF / B / K
Next table / listT / L
Elements list (headings, links, landmarks)NVDA+F7
Switch browse and focus modeNVDA+Space
Quit NVDANVDA+Q

Add Shift to most single-letter commands to move backwards, for example Shift+H for the previous heading.

Browse mode and focus mode

NVDA has two modes, and understanding them explains many test results.

  • Browse mode is for reading. Letters such as H and K are navigation shortcuts, and arrow keys move through content.
  • Focus mode passes keys to the page, so users can type in a text field or use arrow keys inside a widget. NVDA switches to focus mode automatically when you move into a form field or certain widgets, and plays a sound.

If arrow keys do nothing inside your custom widget, it may lack a role that tells NVDA to switch to focus mode. If typing in a field triggers navigation instead of text, focus mode did not activate.

VoiceOver on macOS basics

ActionKeys
Turn VoiceOver on or offCmd+F5 (or hold Cmd and press Touch ID three times)
VoiceOver modifier (VO)Control+Option, or Caps Lock if enabled
Stop speakingControl
Next / previous itemVO+Right Arrow / VO+Left Arrow
ActivateVO+Space
Read from hereVO+A
Rotor: lists of headings, links, landmarks, form controlsVO+U, then left and right arrows to change list
Next headingVO+Cmd+H
Enter / leave a group or web areaVO+Shift+Down Arrow / VO+Shift+Up Arrow

Quick Nav lets you use single keys like NVDA's browse mode. Press the left and right arrows together to toggle it, then use the arrows alone to move. With single-key Quick Nav turned on in VoiceOver Utility, H jumps to headings.

The first time you start VoiceOver, macOS offers a tutorial. It takes about 15 minutes and is worth doing.

VoiceOver on iPhone

Turn it on under Settings, Accessibility, VoiceOver, and set the Accessibility Shortcut to triple-click the side button so you can turn it off quickly.

  • Swipe right / left: next / previous item.
  • Double-tap: activate the selected item.
  • Rotate two fingers: open the rotor and choose Headings, Links or Form Controls, then swipe down and up to move.
  • Two-finger swipe up: read the whole page.

A test routine

Run the same routine on each page or component.

  1. Page load: is the page title announced, and does it identify the page?
  2. Headings: open the headings list. Do the headings form a sensible outline, with one h1?
  3. Landmarks: jump through landmarks. Is all content inside one, and are repeated ones labelled?
  4. Links: open the links list. Does each link make sense out of context?
  5. Images: move through images. Is the alt text accurate, and are decorative images skipped?
  6. Forms: tab through the fields. Does each announce a label, its role, required state and hint? Submit with errors: are the errors announced and easy to find?
  7. Widgets: open menus, tabs, accordions and dialogs. Are the role and state announced, such as "collapsed" or "selected"? Does focus move into dialogs and back out again?
  8. Dynamic updates: trigger a search, add to the basket or save. Is the result announced?

What to listen for

Each interactive element should announce three things: its name, its role and its state if it has one. For example:

Plain text
Delivery information, button, collapsed
Email address, edit, required, invalid entry. Enter your email address
Main, navigation landmark
Show password, checkbox, not checked

Typical failures sound like this:

You hearLikely cause
"button" with no nameIcon button without an accessible name
"clickable" or nothing for a controlA div or span used as a control
"edit" with no label, or the placeholder onlyMissing label
"IMG_0423 dot jpg, graphic"Missing alt attribute
No change after pressing a togglearia-expanded or aria-pressed not updated
Silence after a search or saveNo live region or focus change
Reading jumps to the top of the pageFocus was lost when an element was removed
Content read that is visually hidden behind a modalThe background is not inert

Write down exactly what you heard, the screen reader, browser and versions, and the steps to reproduce. Precise notes make issues easy to fix and retest.

Screen readers and browsers differ, and occasionally a correctly built pattern is announced oddly in one combination. Before adding workarounds, check that your code follows the spec and the ARIA Authoring Practices Guide. Fix your code first; do not code for one screen reader's quirks.

Summary

  • Test with real combinations: NVDA with Firefox or Chrome, VoiceOver with Safari, and VoiceOver on iPhone.
  • Learn a small set of commands: next heading, landmark, form field, elements list or rotor, stop speaking.
  • Understand NVDA's browse and focus modes; they explain many widget problems.
  • Listen for name, role and state on every control, and for announcements after updates.
  • Follow the same routine on each page and record exactly what you heard.

Further reading