Accessibility test toolkit

Troubleshooting

Most a1 failures have one of a few causes: no browser, no active session, the wrong screen reader started, or a page that had not rendered yet. doctor finds the first two. This page covers the rest, with the exact error text each one prints.

Run doctor first

a1 doctor checks the browser and each screen reader, and prints the exact command to fix whatever is missing under Action items. Most of the environment errors below appear when a command runs before a step doctor reported is fixed.

a1 doctor

See the quickstart for what each check does and setting up VoiceOver or NVDA for the one-time steps each of them needs.

Session errors

missing-session ✗ Error (missing-session): No active screen reader session. Start one with "a1 sr start". Every sr command but press, type, do, and walk needs a session already running. Run sr start --sr virtual <url> first.
A command exits 4 that you expected to pass find, goto, wait --for, and expect exit 4 when nothing matches, so a script can act on it. Run sr transcript to see every announcement so far. Word order matters: the simulated screen reader announces the role, then the name, such as "button, Pay", not "Pay, button".
sr wait --for never matches wait only matches announcements made after it starts. An announcement the triggering command already printed in its own output came before the wait and does not match. Check that output directly, or run expect --since against a checkpoint set before the triggering command. See assert on the transcript.

Browser errors

browser-unavailable ✗ Error (browser-unavailable): No usable Chromium-family browser is available for Playwright automation. Install one: npx playwright install chromium, or install Chrome, Edge, Brave, or Chromium and a1 will find it. a1 doctor --json lists every candidate it checked under result.browserAutomation.candidates.
The scan hangs, then times out --timeout <ms> bounds how long loading the page may take, 10000 ms by default. A route behind auth or a slow dev server needs a longer timeout, or --wait-for <css> to wait for a specific element instead of the page's own load event.

VoiceOver started unexpectedly

sr start and sr walk start VoiceOver on macOS when --sr is not given and no session is active. If VoiceOver just took over the screen, run a1 sr stop to end that session, then rerun the command with --sr virtual. Add that flag to every script and CI step. See run in CI.

a1 sr stop --json
a1 sr walk http://localhost:3000/checkout --sr virtual --json

Recording problems

See record a session for the full list: screen recording permission belongs to the app running a1, not to a1 itself, the simulated screen reader cannot record, and a recording that is empty means the session was stopped before the file finished writing.

Empty results

A page with under 10 elements and 50 characters of text adds a warning that a single-page app may not have mounted. Load the route in a browser first to confirm it renders before trusting an empty axe or tree result.

The relevant criteria scan in a1 audit reports not-detected for the same reason: it reads only the HTML the server returned, so content a client framework adds after load is not detected. See the limits of the relevant criteria scan.