Testing and Evaluation

No single testing method catches all accessibility issues. A thorough evaluation combines automated scanning (fast, catches ~30–40% of issues), manual keyboard testing, screen reader testing, and user testing with people with disabilities. This page provides practical procedures for each method.

Automated testing tools

Developer

Browser extensions (daily use)

These tools run directly on any web page and provide instant results:

ToolBrowserBest for
axe DevTools (Deque)Chrome, Firefox, EdgeMost accurate automated scanner; low false-positive rate
WAVE (WebAIM)Chrome, FirefoxVisual overlay showing issues in context on the page
ARC Toolkit (TPGi)ChromeDetailed WCAG criterion mapping; good for audit documentation
LighthouseChrome (DevTools)Quick score and top-level audit; built into Chrome

Recommended daily workflow: Install axe DevTools and run it on every page before merging. Address all “violations” (confirmed issues) before treating “needs review” items (possible issues requiring human judgment).

Running axe in DevTools

  1. Open Chrome DevTools (F12)
  2. Navigate to the axe DevTools tab
  3. Click Scan ALL of my page
  4. Review violations — each links to the affected element and explains the fix
  5. Use Highlight to see the element on the page
  6. Use inspect element to jump to the DOM

CI/CD integration

For automated testing in your build pipeline:

// Jest + axe-core example
import { axe, toHaveNoViolations } from 'jest-axe';
expect.extend(toHaveNoViolations);

test('home page has no accessibility violations', async () => {
  const { container } = render(<HomePage />);
  const results = await axe(container);
  expect(results).toHaveNoViolations();
});
// Playwright + axe-core example
import { checkA11y } from 'axe-playwright';

test('home page accessibility', async ({ page }) => {
  await page.goto('http://localhost:3000');
  await checkA11y(page, null, {
    runOnly: { type: 'tag', values: ['wcag2aa', 'wcag21aa'] },
  });
});

Contrast checking

For colour contrast verification outside of axe:

  • Colour Contrast Analyser (TPGi) — free desktop app; eyedropper tool to sample any pixel on screen; essential for checking contrast in images, gradients, and non-text elements
  • WebAIM Contrast Checker — paste hex values; reports AA and AAA pass/fail
  • Chrome DevTools: in the Elements panel, click any colour in the Styles tab to see the contrast ratio against the computed background

Keyboard testing

Developer Designer

Keyboard testing requires no special tools — just set your mouse aside. This is the most direct way to verify that your site is operable without a mouse.

Setup

  • Use a desktop/laptop (not a touch device)
  • Set your mouse aside
  • Use a browser without accessibility extensions that might alter behaviour

The keyboard testing checklist

Work through every page using only:

  • Tab — move focus forward
  • Shift+Tab — move focus backward
  • Enter — activate links, buttons, submit forms
  • Space — activate buttons, checkboxes; scroll page
  • Arrow keys — navigate within components (menus, tabs, sliders, radios)
  • Escape — close modals, dismiss dropdowns

For each interactive element, verify:

  • The first Tab press reveals a “Skip to main content” link
  • Tab order follows the visual reading order (top to bottom, left to right)
  • Every interactive element is reachable by Tab — nothing is skipped
  • Every interactive element shows a visible focus indicator
  • Focus does not move to hidden elements (e.g., off-screen menu items)

Interaction

  • All links activate with Enter
  • All buttons activate with Enter or Space
  • All form controls accept input by keyboard
  • Checkboxes toggle with Space
  • Radio buttons navigate with arrow keys; Space selects
  • Select dropdowns open with Space/Enter; navigate with arrows

Components

  • Dropdown menus: open on Enter/Space, navigate with arrows, close with Escape
  • Modals: focus moves inside on open; Tab cycles within modal; Escape closes; focus returns to trigger on close
  • Accordions: toggle with Enter or Space; focus stays on the button
  • Tabs: arrow keys switch between tabs; Tab moves to tab panel
  • Date pickers: navigate calendar with arrows; Escape closes

No traps

  • You can Tab off every element — no elements trap focus permanently
  • No elements require mouse-only interaction (hover menus, drag-only controls)

Common keyboard failures

SymptomLikely causeFix
Can’t see where focus isoutline: none with no replacementAdd :focus-visible styles
Focus jumps to unexpected locationPositive tabindex valuesUse only tabindex="0" or -1
Focus disappearsElement is hidden with display:none but not truly removedSynchronize hidden attribute with display
Modal doesn’t trap focusNo focus trap implementedAdd focus trap with keydown listener
Menu doesn’t open on EnterClick-only handlerAdd keydown with Enter/Space handler
Can Tab in but not outMissing Escape handlerAdd Escape key to close/collapse

Screen reader testing

Developer

Screen readers interpret the accessibility tree and speak or braille the content to users who are blind, have low vision, or have reading disabilities. They are the most comprehensive manual test because they reveal how your page is actually experienced without vision.

NVDA + Chrome (Windows, free)

Download: nvaccess.org — free, open source.

Basic NVDA commands

TaskKey
Start/stop NVDACtrl+Alt+N (toggle)
Read from cursorNVDA+Down (Insert+Down)
Stop readingCtrl
Next headingH
Previous headingShift+H
List all headingsNVDA+F7 (Elements list)
Next landmarkD
Next linkK
List all linksNVDA+F7, then select Links
Next form fieldF
Next buttonB
Next tableT
Read table cellCtrl+Alt+Arrow
Next listL

NVDA testing procedure

  1. Open Chrome, navigate to the page under test
  2. Start NVDA (Ctrl+Alt+N or from taskbar)
  3. Press H to navigate through headings — verify the heading hierarchy makes sense out of context
  4. Press NVDA+F7 → Links — verify all link text is descriptive
  5. Press D to navigate through landmarks — verify all major regions are present and labelled
  6. Press Tab to navigate through interactive elements — verify every element is announced with a meaningful name, role, and state
  7. Navigate to each form — verify every field is announced with its label and any instructions
  8. Activate a modal dialog — verify focus moves in, Escape closes it, and focus returns to trigger
  9. For dynamic content (search results, errors, status messages) — verify the update is announced without moving focus

VoiceOver + Safari (macOS, built-in)

Enable: System Settings → Accessibility → VoiceOver → Enable.

Basic VoiceOver commands

TaskKey
Toggle VoiceOverCmd+F5
Read next itemVO+Right (Control+Option+Right)
Read previous itemVO+Left
Activate itemVO+Space
Open rotorVO+U
Navigate headings in rotorLeft/Right to select “Headings”, Up/Down to navigate
Navigate landmarksLeft/Right to select “Landmarks”
Navigate linksLeft/Right to select “Links”
Navigate form controlsLeft/Right to select “Form Controls”
Move into web contentVO+Shift+Down

The VoiceOver Rotor (VO+U) is essential — it provides a list of all headings, links, landmarks, and form controls, allowing you to quickly audit a page.

VoiceOver testing procedure

  1. Open Safari, navigate to the page
  2. Enable VoiceOver (Cmd+F5)
  3. Press VO+U to open the Rotor
  4. Check Headings — is the hierarchy logical?
  5. Check Links — are all link names descriptive?
  6. Check Landmarks — are all page regions present?
  7. Check Form Controls — do labels match what is visually displayed?
  8. Tab through interactive elements verifying names, roles, and states
  9. Test dynamic content for appropriate live region announcements

What to listen for

Every interactive element should announce:

  • Name: what it is called (“Submit button”, “Email address field”)
  • Role: what it is (“button”, “text input”, “checkbox”)
  • State (where applicable): “expanded/collapsed”, “checked/unchecked”, “required”, “invalid”

Common screen reader failures:

What you hearProblemFix
”button” (no name)Button has no accessible nameAdd aria-label or visible text content
File name or URLImage missing alt textAdd alt attribute
”image”Image has empty alt but should be informativeWrite descriptive alt text
Long URL as link textLink text is the URL, not descriptionReplace with descriptive text
Form field announced without label<label> not associated with inputAdd for/id association
Nothing announced after submitError not in live region, focus not movedAdd role="alert" or move focus
”group” with no name<fieldset> missing <legend>Add <legend>

iOS VoiceOver (touch gestures)

For mobile testing:

TaskGesture
Read next itemSwipe right
Read previous itemSwipe left
Activate selected itemDouble tap
ScrollThree-finger swipe
Open rotorTwo-finger rotate
Navigate by headingRotor → Headings, then swipe up/down

TalkBack (Android)

Enable: Settings → Accessibility → TalkBack.

TaskGesture
Read next itemSwipe right
ActivateDouble tap
ScrollTwo-finger swipe
Navigate by headingLocal context menu (swipe up then right) → Headings

Colour and visual testing

Contrast verification

For a methodical contrast audit:

  1. Use the Colour Contrast Analyser (TPGi): eyedropper to sample foreground and background colours in any application
  2. Check every text colour / background colour combination in your design system
  3. Check all interactive component states: default, hover, focus, active, disabled
  4. Check dark mode separately — contrast ratios differ from light mode

Greyscale test

Verify that colour is not the only means of conveying information (WCAG 1.4.1):

  1. macOS: System Settings → Accessibility → Display → Colour Filters → Greyscale
  2. Windows: Settings → Ease of Access → Colour filters → Greyscale
  3. In Chrome DevTools: Rendering → Emulate vision deficiency → Achromatopsia

View the page in greyscale and verify:

  • All form states (error, success, required) are distinguishable
  • Chart series are distinguishable
  • Linked text is distinguishable from non-linked text (underline or other non-colour indicator)

Low vision simulation

Chrome DevTools → Rendering → Emulate vision deficiency:

  • Blurred vision: tests readability with reduced acuity
  • Protanopia / Deuteranopia / Tritanopia: tests colour blindness accessibility
  • Achromatopsia: full greyscale

Text spacing test

Apply the WCAG 1.4.12 text spacing bookmarklet to verify layouts do not break when users override:

  • Line height to 1.5× font size
  • Letter spacing to 0.12× font size
  • Word spacing to 0.16× font size
  • Paragraph spacing to 2× font size

Bookmarklet available on the W3C Understanding 1.4.12 page.

Zoom and resize testing

  1. Set browser zoom to 200% — all content and functionality must remain usable
  2. Set browser zoom to 400% — content must reflow to a single column without horizontal scrolling (WCAG 1.4.10)
  3. Set browser default font size to 24px (browser settings) — all text should scale; no overflow or clipping

In Chrome: Settings → Appearance → Font size → Very Large (20px) or Huge (24px).

Reduced motion testing

Verify that animations respect prefers-reduced-motion:

  1. macOS: System Settings → Accessibility → Display → Reduce Motion
  2. Windows: Settings → Ease of Access → Display → Show animations (turn off)
  3. Chrome DevTools: Rendering → Emulate CSS media feature → prefers-reduced-motion: reduce

With reduced motion enabled, verify:

  • CSS transitions are suppressed or simplified
  • Carousels do not auto-advance
  • Parallax effects are disabled
  • Page transitions are instant or simple fades

Conducting an accessibility audit

Everyone

A structured accessibility audit produces a report suitable for compliance documentation, remediation planning, and tracking progress over time.

Audit scope

Define what is in scope:

  • Which pages or templates (audit representative pages, not every page — if the homepage template has an issue, all homepage-template pages likely have it)
  • Which user flows (registration, checkout, contact form, search)
  • Which WCAG version and level (typically WCAG 2.1 AA for Canadian compliance)

Audit methodology

  1. Automated scan: run axe on all pages in scope; document violations
  2. Keyboard walkthrough: complete each user flow by keyboard alone; document failures
  3. Screen reader walkthrough: navigate representative pages with NVDA+Chrome; document issues
  4. Manual checks: colour contrast (visual states), reading order, heading hierarchy, landmark structure, form labelling
  5. Responsive check: 320px viewport, 200% zoom, 400% zoom

Issue severity classification

SeverityDefinitionExample
CriticalBlocks a user from completing a taskModal with no close mechanism
SeriousSignificantly impedes task completionForm errors not associated with fields
ModerateCreates friction but user can work around itMissing heading level
MinorBest practice not followedRedundant alt text

Conformance statement

After remediation, publish an accessibility conformance statement on your website. At minimum, include:

  • Which WCAG version and level you target
  • Known limitations (issues you are aware of but have not yet fixed)
  • Contact information for reporting accessibility issues
  • Date of last assessment

Many organizations use the VPAT (Voluntary Product Accessibility Template) or its Canadian equivalent to document conformance in detail for procurement contexts. See Procurement for guidance on accessible procurement.

Testing schedule

Accessibility is not a one-time audit — it degrades as content and features are added. Build testing into your ongoing workflow:

WhenWhat to test
During developmentaxe DevTools on new components; keyboard test new interactions
Before each releaseFull keyboard walkthrough of changed flows; axe scan of new pages
QuarterlyScreen reader walkthrough of top user flows
AnnuallyFull audit by internal or external accessibility specialist
After major redesignFull audit before launch