Accessibility testing is a software testing technique used to evaluate whether a digital product can be accessed, understood, navigated, and operated by people with disabilities.
Unlike functional testing, which primarily asks “Does the application work as intended?”, accessibility testing asks “Can all intended users use the application effectively?”
It uses a combination of automated checks, manual testing, keyboard testing, screen-reader testing, and testing with assistive technologies to identify accessibility barriers.
Why do you need accessibility testing as a testing technique?
Accessibility testing needs to be treated as a distinct testing technique because accessibility issues are not necessarily detected through conventional functional or UI testing.
For example, a button may:
- work correctly when clicked with a mouse,
- trigger the correct API,
- display the expected result,
- and pass functional tests,
but still be inaccessible to someone who relies on a keyboard or screen reader.
Common Accessibility Testing Techniques
Accessibility testing uses different techniques to uncover different barriers. Some checks can be automated, while others need hands-on testing with a keyboard, screen reader, or other assistive technology.
| Technique | What it checks |
|---|---|
| Automated Accessibility Scanning | Detects machine-testable issues such as missing labels, invalid ARIA, structural errors, and some contrast failures. |
| Keyboard Accessibility Testing | Checks whether users can navigate and operate the interface without a mouse. |
| Screen Reader Testing | Checks how page structure, control names, roles, and states are announced to screen reader users. |
| Focus Management Testing | Checks where focus moves during interactions such as opening dialogs, menus, and other dynamic components. |
| Color Contrast Testing | Measures whether text and important UI elements have sufficient contrast against their backgrounds. |
| Zoom and Reflow Testing | Checks whether content remains readable and usable when users zoom in or increase text size. |
| Semantic Structure Testing | Reviews headings, landmarks, labels, roles, and relationships exposed to assistive technologies. |
| Form and Error Testing | Checks field labels, instructions, validation messages, error identification, and recovery. |
| Dynamic Content Testing | Verifies whether alerts, loading states, validation updates, and other page changes are communicated correctly. |
| Mobile Accessibility Testing | Examines touch targets, text scaling, orientation, gestures, and screen reader behavior on mobile devices. |
| Multimedia Accessibility Testing | Verifies captions, transcripts, audio descriptions, and media controls for audio and video content. |
1. Automated Accessibility Scanning
Automated accessibility testing checks the rendered page against predefined accessibility rules. It works well for repeatable checks that can be evaluated from HTML, CSS, and accessibility attributes.
Automated accessibility scanning solves the problem of finding a large class of accessibility issues quickly and consistently across many pages, components, and builds. Manual testing can find many of the same issues, but it cannot cover the same volume at the same frequency.
For more effective automated accessibility testing, focus on these practices:
- Scan the state users actually interact with. Trigger dialogs, validation errors, expanded menus, lazy-loaded content, and authenticated states before running the scan.
- Run component scans as well as page scans. A labeling defect in one shared input, modal, or date picker can surface across multiple flows.
- Baseline existing violations before enforcing CI failures. On a legacy product, fail builds for newly introduced violations instead of letting existing accessibility debt block every build.
- Track violations by rule and component. Fifty label failures may trace back to one shared form control.
- Scan each supported theme and visual state. Contrast can change between light mode, dark mode, hover, selected, error, and disabled states even when the underlying component is the same.
- Do not suppress a noisy rule globally. Limit an exception to the affected selector or component and record why it exists.
- Compare scan results between builds. Separate new violations from issues that were fixed or remained unchanged.
- Include accessibility scans inside real functional flows. For example, scan checkout after validation fails rather than maintaining a separate accessibility test that never reaches the same UI state.
2. Keyboard Accessibility Testing
Keyboard-only testing reveals whether users can navigate and operate the interface without relying on a mouse or touch input. It is especially useful for finding inaccessible custom controls, broken focus order, and keyboard traps.
Keyboard testing catches interaction problems that automated scans often miss. A control may have valid markup and still be impossible to reach, activate, or escape with a keyboard, especially in menus, dialogs, custom widgets, and dynamic interfaces.
For effective keyboard testing:
- Start from the browser address bar and press Tab. Note where focus enters the page. A skip link or primary navigation item is often the expected first stop.
- Use Tab and Shift + Tab across the full page. Focus should follow the same logical order as the content and should not jump unexpectedly between sections.
- Activate links and buttons with Enter. Use Space for controls that support it, such as buttons and checkboxes.
- Test custom widgets with their expected keys. Menus, tabs, radio groups, listboxes, and similar components often require arrow-key navigation rather than repeated Tab presses.
- Watch the focus indicator on long pages. Sticky headers, cookie banners, and floating widgets should not cover the focused control.
- Try to reach controls that appear only on hover. Any action available with a mouse should also have a keyboard-accessible path.
- Test skip links from the top of the page. Activate the link and confirm that focus moves to the intended content area, not just that the page visually scrolls there.
3. Screen Reader Testing
Screen reader testing checks whether users can understand the page and complete key tasks without relying on visual layout. The best way to test it is through real flows rather than reading the page element by element.
Screen reader testing catches problems that are hard to judge from code or visual inspection alone. A page may look correct and even pass automated checks, but users can still hear unclear labels, missing state changes, duplicate announcements, or content in an order that makes the task difficult to follow.
Try a short task such as signing in, submitting a form, or adding an item to a cart. While doing it, check whether:
- The page title and headings make it clear where you are.
- Buttons and links have useful names. “Close dialog” is useful. “Button” is not.
- Controls announce their current state, such as checked, selected, expanded, or disabled.
- Heading and link lists still make sense when read without surrounding content.
Also listen for duplicate or conflicting announcements. These often appear when visible text, aria-label, and other accessible-name sources are used together incorrectly.
4. Focus Management Testing
Focus management testing verifies where keyboard focus moves after an interaction or content change. Pay particular attention to dialogs, menus, drawers, validation errors, and single-page application updates.
Focus management testing catches problems that basic keyboard navigation can miss. A user may be able to reach and activate a control correctly, but after that action, focus can jump to the wrong place, disappear, or reset to the page body. These issues are especially common when content is added, removed, or replaced dynamically.
| Interaction | Expected focus behavior |
|---|---|
| Open a modal | Focus moves inside the modal. |
| Press Tab inside the modal | Focus stays within the modal while it remains open. |
| Close the modal | Focus returns to the control that opened it. |
| Open a dropdown or menu | Focus moves to the menu or its first relevant item. |
| Submit a form with errors | Focus moves to the error summary or first invalid field, depending on the design. |
| Delete an item from a list | Focus moves to a nearby logical item, not back to the top of the page. |
| Navigate to a new SPA view | Focus moves to a meaningful location in the new view. |
Note: Also test what happens when content disappears. If the focused element is removed from the DOM, focus should not be lost or reset to the page body.
5. Color Contrast Testing
Color contrast testing measures the contrast between text or meaningful UI elements and their background. Under WCAG 2.2 Level AA, the minimum ratio varies by the type of content.
Color contrast testing finds visual accessibility issues that keyboard or screen reader testing will not reveal. It is also important to test beyond static text because automated checks may miss contrast problems in icons, component boundaries, gradients, images, and interaction states.
| What to test | Minimum contrast |
|---|---|
| Normal text | 4.5:1 |
| Large text | 3:1 |
| UI components and graphical objects | 3:1 |
Don’t forget to check contrast in the states users actually encounter. A control may pass in its default state but fail after it is focused, selected, hovered over, or marked as invalid. Include placeholder text, error messages, input borders, focus indicators, and icons that communicate meaning.
Also Read: WCAG for Designers
6. Zoom and Reflow Testing
Zoom and reflow testing checks whether users can enlarge content without losing information or functionality. It is especially useful for finding layout problems that only appear when text and controls take up more space.
It identifies issues that may not show up in automated scans or standard responsive checks. A page can meet accessibility requirements at its default size but still become unusable when content overlaps, containers clip text, dialogs extend beyond the viewport, or users are forced to scroll in two directions just to complete a task.
Set browser zoom to 200% and repeat a task you could complete at 100%. Text should remain readable, controls should stay reachable, and labels should not overlap or disappear.
Then increase zoom to 400%. At this level, the layout should reflow instead of forcing users to pan horizontally for ordinary page content. Watch closely for fixed-height containers that cut off text, dialogs that extend beyond the viewport, and sticky elements that cover buttons or form fields.
Dense screens tend to expose problems first. Tables, dashboards, navigation menus, and checkout forms are good places to test because a layout can look intact at high zoom while still making the task impossible to complete.
7. Semantic Structure Testing
Semantic structure testing checks whether the meaning and hierarchy users see on screen are also exposed correctly to browsers and assistive technologies. A page can look perfectly organized while its underlying structure is incomplete or misleading.
It finds structural problems that visual testing cannot reveal and that task-based screen reader testing may not always expose. Incorrect headings, missing landmarks, unlabeled controls, or the wrong element roles can make navigation and interpretation much harder even when the page looks fine.
Take a page with a clear visual hierarchy. Then inspect whether that hierarchy exists programmatically:
- A section title styled in large bold text should usually be a real heading, not a <div>.
- Navigation should be exposed as navigation, not as a collection of unrelated links.
- Form controls should have programmatic labels.
- Tables should identify headers and data cells correctly.
- Buttons and links should use the right native roles wherever possible.
- Custom controls should expose the correct name, role, state, and value.
Also check heading order using a browser accessibility inspector or screen reader heading list. A jump from <h2> to <h4> may be intentional, but repeated gaps often reveal that headings were chosen for appearance rather than document structure.
The same principle applies to landmarks. If the page visually has a header, navigation, main content, and footer, users of assistive technology should be able to identify those regions just as clearly.
Read More: A Detailed Guide on HTML Semantics
8. Form and Error Testing
Form and error testing checks whether users can understand and recover from validation problems without losing context. It is most useful for finding issues that only appear after submission, when several fields fail at once, or when errors are updated dynamically.
It catches problems that basic form checks often miss. A field may have a valid label and still become difficult to use if the error is not announced, focus moves to the wrong place, or the message does not explain how to correct the input.
Do not test forms only with valid data. Force the form into the states where users are most likely to get stuck.
- Submit the form with required fields left blank.
- Enter an invalid value, such as rohit@ in an email field.
- Move focus back to the failed field and check whether its label and error are announced together.
- Type into fields that rely on placeholder text and confirm the field purpose is still clear after the placeholder disappears.
- Trigger errors in several fields at once.
- If an error summary appears, activate each error link and confirm it moves focus to the correct field.
- Correct one invalid field and confirm that only its error is cleared.
- Submit the form successfully and check that the success message is announced.
For implementation checks, inspect how errors are associated with fields. Attributes such as aria-describedby or aria-errormessage can expose the error programmatically, but the message itself still needs to tell the user what went wrong.
9. Dynamic Content Testing
Dynamic content testing checks whether updates that happen without a full page reload are exposed to assistive technologies at the right time. This includes status messages, result counts, loading states, cart updates, and newly inserted content.
It highlights a class of issues that static page checks cannot. The page may be accessible when first loaded, but users can still miss important changes if an update happens silently or is announced too late to be useful.
| Trigger | What to check |
|---|---|
| Add an item to cart | Activate Add to cart with a screen reader running. Confirm that the cart update or success message is announced without moving focus to find it. |
| Apply a filter | Change a filter and listen for the updated result count, such as “12 results found.” |
| Start a loading action | Trigger search, save, or refresh. Check whether a loading status is announced when users would otherwise have no indication that the action is still running. |
| Load more results | Load additional content without refreshing the page and confirm the new content or updated result count is exposed without unexpectedly moving focus. |
Note: For dynamic updates, check whether aria-live, role=”status”, or role=”alert” is used appropriately. Messages should also be specific: “Payment saved” is useful; “Updated” is not.
10. Mobile Accessibility Testing
Mobile accessibility testing checks whether key tasks remain usable with touch, gestures, screen readers, larger text, and smaller viewports. Desktop testing cannot fully cover these conditions because mobile devices introduce different interaction patterns and platform behaviors.
It catches issues such as touch targets that are hard to activate, controls that become unusable at larger text sizes, incorrect swipe order, gesture conflicts, and differences between VoiceOver on iOS and TalkBack on Android.
On mobile, repeat a real task such as signing in, completing checkout, or submitting a form. Swipe through controls with the screen reader enabled and check whether the order matches the visual flow. Increase system text size and confirm that labels, buttons, and form fields do not get cut off. Rotate the device and make sure content remains usable in both orientations.
Also test touch interactions directly:
- Try activating small icons and controls without zooming.
- Check that adjacent touch targets are not so close that the wrong one is easy to trigger.
- Use screen reader gestures to open menus, select options, and dismiss dialogs.
- Connect an external keyboard where supported and repeat the key flow.
- Test critical screens on both iOS and Android when the product supports both platforms.
11. Multimedia Accessibility Testing
Multimedia accessibility testing checks whether users can understand and control audio and video when they cannot rely on sound, visuals, or pointer input alone. It covers the media content itself as well as the controls used to play it.
It identifies issues that page-level accessibility checks often cannot. A video player may be keyboard accessible, for example, while the video still has inaccurate captions, missing audio descriptions, or important visual information that is never communicated in another form.
- Play the video with sound muted. Captions should include spoken dialogue and important sounds needed to understand what is happening.
- Compare captions with the audio. Look for missing words, incorrect names, poor timing, or captions that disappear before they can be read.
- Check audio-only content for a transcript. The transcript should include the information needed to understand the recording.
- Watch the video without looking at the screen. If important information is communicated only visually, check whether audio description or an equivalent alternative is available.
- Operate the media player with a keyboard. Play, pause, volume, captions, seek controls, and full-screen controls should be reachable and usable.
- Turn captions on at smaller viewport sizes. Make sure they do not cover controls or important visual content.
Conclusion
A clean accessibility scan does not mean the interface is accessible. Problems can still appear when someone tabs through a modal, increases browser zoom, submits an invalid form, uses a screen reader, or completes the same flow on a mobile device.
Use automated checks for repeatable code-level issues, then test critical flows with the techniques that require real interaction. The combination catches both violations in the implementation and barriers that only become visible when someone actually uses the product.