Audit, test, and maintain

Test with keyboard and assistive technology

Use a small repeatable matrix across browsers, screen readers, zoom, voice, and input modes.

Automation covered a third. The rest needs a human at a keyboard, a screen reader, a zoomed screen and a voice. But “test with a screen reader” is not a plan. It’s an afternoon of wandering. A plan says which combinations, which tasks, what you expect to hear, and what counts as evidence.

Pick a small matrix

Screen readers and browsers pair up differently. VoiceOver is tuned for Safari. NVDA and JAWS are tuned for Chrome and Firefox on Windows. Testing one pair doesn’t tell you about the others, and testing every pair is impossible. Pick the ones your audience uses and write them down.

For the registration page I use this:

Keyboard only           Chrome, macOS
Zoom 400%               Chrome, 1280px screen
Screen reader, desktop  VoiceOver + Safari, macOS
Screen reader, desktop  NVDA + Firefox, Windows
Screen reader, mobile   VoiceOver + Safari, iOS
Voice control           Voice Control, macOS

Six rows. Each release runs all six against the same tasks. When a JAWS user reports a bug, we add a row.

Learn the handful of commands you need

You don’t need to master a screen reader to test with one. On macOS, Command + F5 toggles VoiceOver. The VO keys are Control + Option. VO + Right Arrow reads the next item, VO + U opens the rotor with headings, landmarks, form controls and tables. On Windows, NVDA is free. Insert is the NVDA key, and in a page you press H for the next heading, F for the next form field, B for the next button and T for the next table. On iOS, swipe right to move to the next item and double tap to activate it.

Ten minutes with those and you can run every task in this course.

Write the expected outcome first

Each row gets the same tasks from lesson 1, with the expected result spelled out before you start:

Task: submit with 2 errors
Expect: focus lands on "There are 2 problems with your registration"
        each invalid field announces its error text
        valid values are still in place

Task: say "Click Register" (voice control)
Expect: the form submits

Run it and record pass or fail per row, with a screenshot or a short recording as evidence. Here’s a finding from our matrix that keyboard testing alone never showed:

Voice Control, macOS  "Click Add a guest"  FAIL
  Nothing happens. Button has aria-label="Open guest dialog".
  Fix: remove aria-label so the visible text is the name.

That’s WCAG 2.5.3 Label in Name, caught because a voice row was in the matrix.

Don’t overclaim

A pass on six rows means the page works on six rows. Say that in the report. The mistake is to test on your own Mac with VoiceOver, hear everything announced nicely, and write “screen reader accessible”. An NVDA user on Firefox may hit a different problem, and now they don’t believe the rest of your report either.

The other mistake is exploring without a task. You listen to the page for ten minutes and conclude it “sounds fine”. Without an expected outcome there’s nothing to fail, so nothing fails.

Try this on your own page: pick three rows, write the expected result for a registration-style task before testing, run it, and keep the evidence for each row.

Lesson completed