Chatbot Accessibility Testing: A Practical Checklist

Use this chatbot accessibility testing checklist to verify keyboard controls, screen-reader announcements, zoom, touch targets, and human handoff.

Cover Image for Chatbot Accessibility Testing: A Practical Checklist

Google DeepMind introduced a sign-language-to-text model on August 12, bringing ASL dictation to Gboard and Live Transcribe on Pixel 11. The announcement is a useful reminder that conversational AI includes people who type, sign, speak, zoom, dictate, switch devices, and use assistive technology.

A website chatbot should support those routes before it claims to improve access. Run this checklist against the deployed widget, not a design file or isolated component.

TestPass conditionFast manual check
Launcher nameA screen reader announces purpose and stateInspect the accessibility tree, then open and close it
Keyboard routeEvery control works without a pointerComplete one conversation using Tab, Shift+Tab, Enter, Space, and Escape
Focus handlingFocus enters the chat, stays predictable, and returns to the launcherWatch the focus indicator through open, send, error, handoff, and close
New-message announcementNew replies are announced once, without stealing focusSend three messages while reading elsewhere in the transcript
Zoom and reflowNo control or message is lost at a 320 CSS pixel viewportTest the page and open widget at narrow width and high zoom
Target sizeControls are at least 24 by 24 CSS pixels or have enough spacingMeasure launcher, send, close, attachment, and suggested-reply targets
Error recoveryThe error is announced and the draft remains editableDisconnect the network during send, then retry
Human handoffThe user can request help and receives a clear next stepTrigger handoff with keyboard and screen reader only

Passing an automated scan is useful, but it does not prove that a conversation makes sense. Chat widgets change while the user interacts with them. Messages arrive, typing indicators appear, suggestions are replaced, and focus can jump. The important failures live in that sequence.

Test a complete conversation, not eight separate controls

Start with the real entry point on a representative page. Cookie banners, sticky navigation, support launchers, and mobile browser chrome can collide even when each component works alone.

Use a short task with a known outcome:

Find the return window for an opened item, ask one follow-up question, and request a person if the answer remains unclear.

Run it four ways: keyboard only, a desktop screen reader, 400 percent browser zoom, and mobile touch with increased text size. Keep the question and expected answer constant. That lets you compare interaction failures without confusing them with answer-quality changes.

Record the browser, operating system, assistive technology, viewport, widget version, and result. "Screen reader works" is not a reproducible test result. "VoiceOver on Safari 20.1 announced the assistant reply once and left focus in the message field" is.

If the chatbot is embedded on several site builders or frameworks, repeat the route on each host. An embed can inherit clipping, stacking, font, or focus problems from the page around it. The website chatbot embedding guide covers the installation routes. Accessibility testing must happen after the embed is placed in its final page shell.

Worked example: hear the broken interaction

Consider this screen-reader transcript from a support widget:

Button, unlabeled
Blank
Edit text
Customer: Can I return an opened coffee grinder?
Sending, alert
Sending, alert
Typing, alert
Typing, alert
You can return unopened products within 30 days.
Edit text

The interface is technically present, but the experience fails in several ways. The launcher has no name. Opening it produces no dialog title. Status messages repeat. The assistant answer does not identify its speaker. Most importantly, the reply does not address the customer's use of "opened."

A useful expected transcript looks like this:

Open support chat, button, collapsed
Support chat, dialog
Messages, region
Message, edit text
Sending message, status
Support assistant: I found the standard return policy, but it does not
state whether opened grinders qualify. Would you like me to connect you
with the returns team?
Message, edit text

The fixed version gives the launcher an accessible name, names the dialog, identifies the live transcript, announces one short status update, labels the speaker, and returns focus to the input. It also preserves uncertainty in the answer. Accessibility and answer quality meet in the same conversation.

Do not treat the wording above as a universal screen-reader script. Different browser and assistive-technology pairs announce roles differently. Define the information that must be conveyed, then verify that a real user can hear it in a sensible order.

Make the keyboard route boring

The keyboard route should have no surprises. The launcher enters the normal tab order. Enter or Space opens it. Focus moves to a useful element inside. Tab reaches the transcript, input, send control, attachments, suggested replies, handoff, and close control in a logical order. Escape closes the dialog when that behavior is offered, and focus returns to the launcher.

The W3C dialog pattern describes the expected focus loop for modal dialogs. If your widget is non-modal, do not label it modal or trap focus inside it. Pick the interaction model first, then make the roles and behavior agree.

Test state changes as well as the happy path:

  • Open the widget, close it immediately, and open it again.
  • Send a message with the button and with the keyboard.
  • Traverse a long answer containing headings, lists, and links.
  • Activate a suggested reply, then edit the populated text.
  • Cause a validation error, a network failure, and a rate-limit response.
  • Request a person, cancel once, then complete the request.

Keep a visible focus indicator throughout. Check that a sticky composer, cookie banner, or mobile keyboard never hides the focused control. A focus ring that exists behind another layer does not help anyone.

Announce changes without reading the whole chat again

Chat interfaces need live updates, but a single broad live region often becomes noisy. Appending one message can cause the screen reader to repeat the transcript, timestamps, buttons, and citations.

Use announcements for compact state changes. Keep long answer content in a structured transcript that the user can navigate at their own pace.

EventAnnouncementAvoid
Send starts"Sending message" when delay is noticeableRepeating it on every render
Reply startsOptional brief typing statusMoving focus to the indicator
Reply completesSpeaker plus new answer, onceRe-reading conversation history
Send failsError and recovery actionA visual red border with no text
Handoff startsDestination and expected next step"Success" with no operational detail

WCAG's guidance for status messages warns that live regions can make an application too chatty. Test with streaming enabled. A chatbot that adds one token at a time may trigger dozens of partial announcements unless the accessible update is buffered.

Do not move keyboard focus to each new answer. That interrupts typing and makes it hard to review an earlier message. A brief announcement can report the arrival while focus stays in the composer. The user can move into the transcript when ready.

Stress the box at zoom and on small screens

Chat widgets tend to use fixed heights, fixed launch positions, and sticky composers. Those choices break when text grows.

W3C's reflow guidance uses a 320 CSS pixel-wide viewport for horizontally written content, equivalent to a 1280-pixel-wide browser at 400 percent zoom. At that width, verify that:

  • the close control remains visible;
  • message text wraps without horizontal scrolling;
  • code, links, and long order numbers do not push the panel wider;
  • the composer does not cover the latest message;
  • error text remains next to the field it explains;
  • suggested replies wrap or scroll without hiding their labels;
  • the host page does not place another fixed control over the widget.

Run the same checks with browser text enlargement and operating-system text settings. A responsive mobile screenshot at default text size cannot substitute for either test.

Measure interactive targets too. WCAG 2.2 sets a 24 by 24 CSS pixel minimum at Level AA, with defined exceptions for spacing and other cases. Small icon controls often fail first: close, send, microphone, attachment, copy, feedback, and carousel arrows. The visual icon may stay small while padding enlarges its clickable area.

Grade the answer as accessible content

The widget can have perfect focus management while the model returns unusable material. Include answer structure in the test set.

Ask for instructions, a comparison, a policy answer, a phone number, and a multi-link response. Check that headings follow a meaningful order, lists are real lists, link labels identify their destination, and tables have headers. Avoid walls of text that depend on bold styling alone.

Test generated controls separately. If an answer creates buttons, forms, cards, or selectors, those controls need names, states, keyboard behavior, validation, and stable focus. The generative UI safety guide explains why generated interface intent should map onto reviewed components instead of raw model-authored markup.

Include ambiguity in the prompts. "I cannot see the verification code" may describe a missing email, low vision, screen magnification, or a broken page. The chatbot should ask a useful clarifying question rather than diagnose a disability or send the user through irrelevant steps.

Keep the handoff accessible after the bot stops

Accessibility cannot end at escalation. A handoff that opens an unlabeled third-party form, removes the transcript, or demands a phone call can erase all the work the customer just completed.

Test the whole transfer. The chatbot should state where the request is going, which details will be shared, what the user must do next, and what response time the team can actually support. Preserve the draft if submission fails. When the transfer completes, announce the result and leave the confirmation available in the transcript.

The handoff packet should carry the customer's question, relevant answers, unresolved point, and accessibility preference only when the user chooses to share it. The chatbot handoff routing guide provides a field-level routing pattern that avoids making the customer repeat the case.

Ship with evidence, then keep listening

Set a release gate that names the supported browser and assistive-technology combinations. Require a complete task on each route, plus automated checks for common markup errors. Save the manual transcript, screenshots at high zoom, failed steps, and fix owner with the release record.

Automated tools catch missing names, contrast failures, and invalid relationships. They do not tell you whether streaming speech is coherent, whether the focus order matches the conversation, or whether a handoff leaves someone stranded. Include disabled users in research and paid testing. Their results should change the backlog, not decorate a compliance report.

The best accessibility test is a conversation completed under real constraints. Test the opening, the changing transcript, the answer, the failure paths, and the transfer as one route. A chatbot becomes more useful when every customer can reach the same outcome without fighting the interface.

Build your chatbot for free →

No credit card required.

Gratis aan de slagGeen creditcard nodig