EduFlow

Section 5 · Testing and Accessibility Culture

Testing with a Keyboard and Screen Readers

18 min4 min readChoose wisely

Lesson at a glance

Test Ticketly by hand with a keyboard, NVDA and VoiceOver using the core navigation commands, recognise what correct announcements sound like, and write findings developers can act on.

  1. 1The keyboard pass
  2. 2Which screen readers to test
  3. 3NVDA essentials
  4. 4VoiceOver essentials (macOS)
  5. 5What correct sounds like
  6. 6Writing it up

No video here — just the real thing: a written lesson, runnable examples, a quiz and practice.

Automated tools told you what Ticketly is missing. A keyboard and a screen reader tell you what it is like to use. This is the part of testing that most teams skip, and it is the part that finds the problems people actually complain about. You don’t need to become an expert screen reader user. You need about fifteen commands and a habit of listening carefully.

The keyboard pass

Start every manual test without a mouse. Go from the address bar to the end of the page with Tab, then back with Shift+Tab, and at each stop ask:

  1. Can I reach it? Every control a mouse can use must be reachable.
  2. Can I see it? Focus is clearly visible and not hidden behind sticky bars.
  3. Is the order logical? Focus follows the reading order of the page.
  4. Does it work? Enter follows links and activates buttons; Space activates buttons and toggles checkboxes; arrow keys work inside radios, tabs and menus.
  5. Can I get out? Escape closes dialogs and menus, focus returns to the opener, and nothing traps focus.

On Ticketly, this pass alone found the positive tabindex, the invisible focus, the div button and the modal that left focus behind, before anyone opened a screen reader.

Which screen readers to test

In WebAIM’s 2026 survey, the most common primary desktop screen readers were JAWS (55.0%) and NVDA (32.9%), both on Windows, followed by VoiceOver on macOS (6.5%). On mobile, 72.2% of respondents use VoiceOver on iOS, well ahead of TalkBack on Android (29.5%). A practical test matrix:

  • NVDA with Chrome or Firefox on Windows. NVDA is free and open source, and behaves closely enough to JAWS to catch most problems.
  • VoiceOver with Safari on macOS, built in.
  • VoiceOver on iOS for anything people use on phones, which at a festival is almost everything.

NVDA essentials

NVDA has two modes. In browse mode, NVDA reads the page with a virtual cursor and single letters jump between elements. In focus mode, keys go to the control, so you can type in a field. NVDA switches automatically when you enter a field, and NVDA+Space switches by hand. The NVDA key is Insert by default; you can also enable Caps Lock as the NVDA key, which is handy on laptops.

Action NVDA keys
Start NVDA / stop speech Ctrl+Alt+N / Ctrl
Read from here NVDA+Down Arrow
Next line or item Down Arrow
Next heading / heading level 2 H / 2
Next landmark D
Next form field / button / link F / B / K
Next table, then move through cells T, then Ctrl+Alt+Arrows
List of headings, links, landmarks NVDA+F7

Add Shift to any single-letter command to go backwards.

VoiceOver essentials (macOS)

Turn VoiceOver on and off with Cmd+F5. The VO keys are Control+Option. Before you start, open Safari’s settings and enable “Press Tab to highlight each item on a webpage”; otherwise Tab skips links in Safari and you will report false bugs.

Action VoiceOver keys
Next / previous item VO+Right / VO+Left
Activate VO+Space
Read from here / stop speech VO+A / Control
Next heading VO+Cmd+H
Rotor (headings, links, landmarks, form controls) VO+U, then Left/Right to switch lists

On iOS, swipe right and left to move between items, double-tap to activate, and rotate two fingers on the screen to open the rotor.

What correct sounds like

Every interactive element should be announced with a name, a role and, where relevant, a state or value. Listen for the missing piece:

You hear Verdict
“Book now Friday pass, button” Name and role: good
“Save to wishlist, toggle button, not pressed” Name, role, state: good
“edit text, blank” No name: the field has no label
“Pay now” (and Tab skips it) No role, not focusable: a clickable div
“graphic, IMG underscore 2041 dot jpeg” Missing alt attribute
“How do refunds work?, button” on a disclosure No state: aria-expanded is missing

Also listen for what doesn’t happen: no announcement after adding a ticket, nothing said when a dialog opens, an error that appears silently.

Writing it up

A finding a developer can fix in one go has six parts:

findings/ticketly-042.txt
Title:    Quantity stepper buttons have no accessible name
Where:    /events/friday, Friday pass card
Steps:    NVDA + Chrome. Tab to the "−" button after "Quantity".
Actual:   NVDA says "button". Same for "+".
Expected: "Fewer Friday passes, button" and "More Friday passes, button".
WCAG:     4.1.2 Name, Role, Value (A). Severity: high (blocks purchase).

You now have every tool you need: automated scans, a keyboard and two screen readers. The final lesson puts them together into a complete audit of Ticketly, and into habits that keep it accessible after you leave.

Key takeaways

  • A keyboard pass checks reachability, order, visible focus, operation with Enter and Space, Escape on overlays, and no traps.
  • Test NVDA with Chrome or Firefox on Windows and VoiceOver with Safari on macOS and iOS; together they cover most real screen reader use.
  • Screen reader users navigate by headings, landmarks, links and form fields, so test with those commands, not only by reading from the top.
  • Every announcement should give a name, a role and any state; a missing piece of that trio is a bug.

Further reading

Check your understanding

3 questions

Question 1 of 3

You are testing Ticketly with NVDA in browse mode. Which key jumps to the next heading?

Question 2 of 3

On macOS Safari with VoiceOver on, Tab skips every link on Ticketly and only visits form fields. What is going on?

Question 3 of 3

Focus reaches Ticketly’s “Show more dates” control and NVDA says “Show more dates, button”. The control reveals a hidden list. What is missing?

Practice

Choose wisely

Listen to Ticketly's checkout

You tested Ticketly’s checkout with NVDA and Chrome and wrote down what you heard at seven points. Select every announcement that reveals a bug. For each one, think about which of name, role and state is missing or wrong.

Listen to Ticketly's checkout