MCPInstall

accessibility-testing

Test for WCAG 2.2 AA compliance with axe-core + Playwright, keyboard navigation audits, screen reader testing, ARIA pattern validation, and legal compliance mapping (ADA, EAA, Section 508). Automated tools catch 30-40% of issues — this skill covers automated and manual testing together. Use when: "accessibility," "a11y," "WCAG," "screen reader," "axe," "keyboard navigation," "ARIA," "ADA compliance." Not for: cookie-consent/GDPR compliance — use compliance-testing; pixel-diff visual regression — use visual-testing. Related: playwright-automation, compliance-testing, visual-testing, ci-cd-integration.

Installs
1.2K
Last 24h
+12
Trending rank
#7984
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/petrkindlmann/qa-skills --skill accessibility-testing
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads accessibility-testing automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

<objective> Make an application usable by people who rely on keyboards and assistive technology, and prove it with tests that run in CI. A button that passes `toBeVisible()` can still be unreachable by keyboard; a page with zero axe violations can still be impossible to operate with a screen reader. Automated tools catch 30-40% of accessibility issues — this skill covers the automated scan plus the keyboard, screen reader, and ARIA-state testing that catch the other 60-70%. </objective>

Discovery Questions

Check .agents/qa-project-context.md first — if it exists, use it as the foundation and skip anything already answered.

Requirements and compliance (sets the target level and audit obligations)

  • What WCAG conformance level is required — A, AA, or AAA? AA is the practical legal default.
  • What laws apply — ADA, EAA/EN 301 549, Section 508, AODA? Each maps to a WCAG level.
  • Is there a VPAT or accessibility statement to maintain, or contractual a11y clauses from enterprise/government customers?

Current state (tells you whether you're auditing or preventing regressions)

  • Has an audit run before? What were the findings, and what's already in the backlog?
  • Does the design system carry accessibility guidance and accessible components?

Testing infrastructure (determines what you can automate vs. must do by hand)

  • Is automated a11y testing already in CI?
  • Which screen readers does the team test with — VoiceOver, NVDA, JAWS, TalkBack?

Core Principles

  1. Automated testing catches 30-40% of issues — no more. axe-core finds missing alt text, low contrast, missing labels, and invalid ARIA. It cannot tell you whether alt text is meaningful, whether tab order is logical, or whether a custom widget is operable. Passing axe is necessary, not sufficient. Crucially, axe ships no automated rule for several WCAG 2.2 success criteria (2.4.11 focus-not-obscured, 2.5.7 dragging movements, and 2.5.8 target-size only partially) — a green axe run does not equal 2.2 AA conformance.

  2. Semantic HTML first, ARIA as last resort. Native elements (<button>, <nav>, <input>, <dialog>) carry built-in semantics, keyboard behavior, and screen reader support. A <div role="button"> also needs tabindex, Enter/Space handlers, focus styles, and ARIA state — all of which a <button> gives you free. Reach for ARIA only when no native element fits.

  3. Test in impact order: keyboard, screen reader, automated. Keyboard issues physically block users from features (highest impact). Screen reader issues confuse with wrong announcements. Automated checks catch the mechanical remainder. Start where the damage is worst, not where the tooling is easiest.

  4. Accessibility is a quality attribute, not a feature. Test it continuously like performance or security — every new component, every PR. Retrofitting accessibility onto a finished product costs 10-100x more because inaccessible patterns get baked into the component library.

  5. Test with real assistive technology. Browser DevTools and axe extensions are dev aids, not substitutes for VoiceOver (macOS/iOS), NVDA (Windows), and TalkBack (Android), which each behave differently. Reserve manual AT passes for complex custom widgets.

Automated Scanning with axe-core + Playwright

Install @axe-core/playwright pinned to an exact version from npm view @axe-core/playwright version (4.14.0 on 2026-10-21; its minor tracks axe-core's, so a new rule set arrives with every bump and must be reviewed, not auto-updated). Wrap it in a reusable checkAccessibility(page, testInfo, options) helper that filters to the WCAG tags ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa']. Require an expected URL and an application-owned readiness assertion before scanning: blank, error, and redirected pages can pass axe. Attach the full results JSON, reject a scan that evaluated no rules, and assert violations.toHaveLength(0). The exported scanAccessibility helper returns the violation summary for known-gap baselines; checkAccessibility requires zero violations. Loop it over every key page and over interactive states (modal open, menu expanded, signed-in account), not just the default load. For a third-party page you cannot fix, assert the exact set of known rule ids instead of skipping the scan, so a new violation or a fixed one changes the test.

Suppress a rule only with a documented justification (a tracking issue or inline comment) and exclude third-party widgets you don't own rather than disabling the rule globally.

See references/recipes.md for the install command, RGAA tag caveat, the full helper, the page-loop and interactive-state specs, rule suppression, and CI integration.

Manual Testing Checklist

Automated scanning is the floor. These checks need a human (or a keyboard-driven Playwright spec — see references/recipes.md for the keyboard specs).

Keyboard navigation audit

  • Tab order is logical — left-to-right, top-to-bottom for LTR. No surprise focus jumps.
  • All interactive elements reachable via Tab / Shift+Tab.
  • Focus indicator visible on every focused element. No outline: none without a replacement.
  • Skip link works — first Tab reveals "Skip to main content"; Enter moves focus to <main>.
  • Enter activates buttons/links; Space activates buttons and toggles checkboxes.
  • Escape closes modals, dropdowns, tooltips; focus returns to the trigger.
  • Arrow keys navigate within tabs, menus, radio groups, tree views.
  • No keyboard traps (modal dialogs intentionally trap until dismissed — that's allowed).
  • Custom widgets operable without a mouse (sliders, date pickers, drag-and-drop).

Screen reader testing

Screen ReaderOSBrowserFree?
VoiceOvermacOS/iOSSafariYes (Cmd+F5)
NVDAWindowsFirefox/ChromeYes
JAWSWindowsChrome/EdgeNo
TalkBackAndroidChromeYes
  • Page title announced on navigation.
  • Headings form a navigable outline (h1 → h2 → h3, no skipped levels).
  • Images have descriptive alt text (or alt="" for decorative).
  • Form inputs announce their labels when focused.
  • Required fields announced as required; errors associated with their input.
  • Live regions announce dynamic content (toasts, loading states).
  • Buttons/links announce their purpose (no "click here").

Color contrast and visual

  • Normal text: 4.5:1 minimum (WCAG AA). Large text (18pt+ / 14pt+ bold): 3:1.
  • UI components and graphical objects: 3:1 against adjacent colors.
  • Information never conveyed by color alone — add icons, patterns, or text.

Form and error accessibility

  • Every input has a visible <label> tied via for/id (placeholder is not a label).
  • Required fields indicated visually and programmatically (required / aria-required).
  • Errors use aria-describedby to link to the input and role="alert" to announce.
  • Focus moves to the first error on submission failure.
  • Related fields grouped with <fieldset> and <legend>.

WCAG 2.2 Quick Reference

Level A (must fix)

CriterionWhat it meansCommon failure
1.1.1 Non-text ContentImages have alt text<img> without alt
1.3.1 Info and RelationshipsStructure via HTML semantics<div> styled as a heading
2.1.1 KeyboardAll functionality via keyboardCustom widget responds only to mouse
2.4.1 Bypass BlocksSkip navigation linkNo skip link
3.1.1 Language of Page<html lang="en"> setMissing lang
3.3.1 Error IdentificationErrors described in textError shown only by red border
4.1.2 Name, Role, ValueCustom controls expose name/role<div onclick> with no role

Level AA (most common legal requirement)

CriterionWhat it meansCommon failure
1.4.3 Contrast (Minimum)4.5:1 normal, 3:1 largeLight gray on white
1.4.4 Resize TextScales to 200% without lossFixed-height containers clip text
1.4.11 Non-text ContrastUI components 3:1Low-contrast input borders
2.4.7 Focus VisibleKeyboard focus visibleoutline: none with no replacement
2.5.8 Target SizeTouch targets 24×24px minTiny icon buttons
3.3.2 Labels or InstructionsInputs have labelsPlaceholder as the only label
3.3.8 Accessible AuthNo cognitive function testCAPTCHA with no alternative

Level AAA (nice to have)

CriterionWhat it means
1.4.6 Contrast (Enhanced)7:1 normal text, 4.5:1 large
2.4.9 Link Purpose (Link Only)Link text alone describes destination
3.1.5 Reading LevelLower-secondary education level

Accessible Patterns

Test on the accessible tree (roles, names, ARIA state), not on CSS. The patterns you need runnable tests for:

  • Forms — error linked via aria-describedby, aria-invalid='true', focus on first error.
  • Modal/dialog — aria-modal='true', aria-labelledby, focus trapped, Escape returns focus.
  • Interactive states — opened dropdown (role="menu" or role="listbox", aria-expanded), loading skeleton (aria-busy='true' during fetch), toast (aria-live='polite'). These carry different ARIA per state, so click to trigger the state change and assert the open-state ARIA — the default page snapshot never exercises them.
  • Data tables — columnheader roles, aria-sort reflects the active sort.
  • Landmarks — exactly one main; banner, navigation, contentinfo present.

See references/patterns.md for the full runnable tests for every pattern above.

ARIA Snapshots

Playwright's toMatchAriaSnapshot() captures the accessible tree as YAML and asserts against it — the fastest way to catch a regression where a visual change silently breaks semantics (a <div> restyled to look like a button, a heading demoted to plain text). It checks structure and accessible names, not pixels, so it's complementary to visual-testing, not a replacement. Scope snapshots to a stable container; whole-page snapshots over async content go flaky. See references/patterns.md for navigation and form snapshot examples.

Legal Compliance Mapping

Law / StandardRegionWCAG level requiredEnforcement
ADAUSAAA (court precedent)Lawsuits (private right of action)
Section 508USA (federal)WCAG 2.0 AAFederal procurement requirement
EAAEUEN 301 549 (WCAG 2.1 AA)In force since 28 June 2025. Member states actively enforcing; private cause of action varies (DE, FR, IE most active). EN 301 549 expected to align with WCAG 2.2 next revision.
AODAOntario, CanadaWCAG 2.0 AAFines up to $100K/day
EN 301 549EUWCAG 2.1 AAPublic procurement requirement
Equality Act 2010UKWCAG 2.1 AA (guidance)Lawsuits
ISO/IEC 40500:2025InternationalEquivalent to WCAG 2.2 (Oct 2023)Useful for procurement/RFP language; freely available from ISO

Practical target: if you serve US or EU users, WCAG 2.2 AA is the target for new development — the EAA is in force, EN 301 549 is expected to update to 2.2, and ISO/IEC 40500:2025 (published Sept 2025) codifies WCAG 2.2 internationally. WCAG 2.1 AA is the legacy minimum where 2.2 can't be reached immediately.

WCAG 3 status: W3C published an updated WCAG 3 working draft in March 2026 that renamed "Outcomes" to "Requirements" and moved away from binary pass/fail grading; it lists ~174 requirements. It remains a working draft — Candidate Recommendation is targeted for Q4 2027 and a Recommendation not before 2028. Plan for WCAG 2.2 today; track WCAG 3 but do not test against it yet.

Audit evidence to collect: automated scan results per page, manual checklists with tester/date, screen reader results with AT versions, accessibility statement, VPAT for enterprise sales, and a remediation plan for known issues. For the full legal/VPAT/consent mapping, see compliance-testing.

Anti-Patterns

Only automated testing

Running axe, finding zero violations, and declaring the product accessible. Automated tools miss 60-70% of real issues and skip several WCAG 2.2 criteria entirely. Fix: pair every axe run with the keyboard and screen reader checklist; gate releases on both, not just the scan.

ARIA overuse

Adding role, aria-label, and aria-describedby to elements that already have native semantics, creating double announcements. Fix: delete the redundant ARIA and use the native element — a <button> never needs role="button".

Ignoring keyboard users

Features that work by mouse and touch but not keyboard — click-only dropdowns, drag-and-drop with no keyboard path, hover-only tooltips. Fix: give every mouse interaction a keyboard equivalent and cover it with a keyboard.spec.ts test (see references/recipes.md).

Retrofitting accessibility

Waiting until the product is "finished," by which point inaccessible patterns are baked into the component library at 10-100x the fix cost. Fix: add an axe check to the Definition of Done so every new component is gated on accessibility before merge.

Treating accessibility as optional

Deprioritizing a11y tickets because "nobody complained" — users with disabilities can't complain through a product they can't use, so they leave silently, and US web-accessibility lawsuits have climbed year over year since 2018. Fix: track a11y as a release blocker with the same severity rules as functional bugs, and report open a11y issues in the release readiness check.

Testing only the happy path

Scanning only the default page state, missing the modals, expanded dropdowns, error messages, and loading skeletons that carry different ARIA. Fix: drive each interactive state in the test (click to open the menu, trigger the fetch) and re-run the scan against the changed DOM.

Failure Modes

SymptomLikely causeFix or check
axe finds 0 violations but the page is unusable by keyboardAutomated scans don't test operability or focus orderRun the keyboard audit; add a keyboard.spec.ts
toMatchAriaSnapshot is flakyDynamic content or list reordering inside the snapshot scopeScope to a stable container; use a partial snapshot
Contrast rule passes but text over a gradient/overlay/image is unreadableaxe can't compute contrast against non-solid backgroundsCheck those cases manually or with a contrast picker
Passing axe but failing a WCAG 2.2 AA auditaxe ships no rule for 2.4.11 / 2.5.7 and only partial 2.5.8Manually verify focus-not-obscured, dragging alternatives, and target size

Verification

Prove the suite actually exercises the page — an a11y test that passes vacuously (wrong URL, axe scanning an error page, snapshot never reached) is worse than none.

  1. Confirm axe is scanning real content. Point the helper at a page you know has a violation (e.g. temporarily remove a <label>) and run it — the test must FAIL and name the rule:
    npx playwright test e2e/tests/a11y/pages.spec.ts
    
    If a page with a planted defect still passes, AxeBuilder is scanning the wrong DOM (redirect, blank page, or wrong selector) — fix that before trusting any green run.
  2. Confirm the keyboard specs reach the app, not a 404. Run npx playwright test e2e/tests/a11y/keyboard.spec.ts and open the trace for the skip-link test — the first Tab should land on the skip link, not nowhere. A test that "passes" because the page never loaded is a false green.
  3. Confirm the CI gate blocks. Introduce one serious violation on a branch and push — the a11y job must exit non-zero and fail the PR check. Revert after.
  4. Spot-check an ARIA snapshot. Run toMatchAriaSnapshot once with --update-snapshots, then again without — the second run must pass. If it flakes, the snapshot scope includes async/reordering content; narrow it to a stable container.

Done When

  • axe-core integrated into the E2E suite and run automatically on all key user-facing pages identified in the test strategy.
  • CI reports zero critical or serious axe violations and blocks merge when any are introduced (see references/recipes.md for the workflow).
  • Keyboard navigation tested end-to-end for all interactive flows (forms, modals, dropdowns, navigation menus).
  • Interactive-state ARIA verified for at least one dropdown/menu (aria-expanded + role), one loading region (aria-busy), and one live region (aria-live).
  • Color contrast validated for the full brand palette against WCAG AA thresholds (4.5:1 normal text, 3:1 large text and UI components).
  • Screen reader test notes documented for complex custom widgets (date pickers, data tables, drag-and-drop), including which screen reader and version was used.

Related Skills

  • playwright-automation — the test runner for both axe scans and keyboard/ARIA snapshot tests; this skill adds the accessibility-specific patterns on top.
  • compliance-testing — legal/regulatory testing including cookie consent (GDPR/CMP), VPAT generation, and EAA/Section 508 reporting. Go there for consent banners and formal compliance documentation; stay here for WCAG conformance testing.
  • visual-testing — pixel-diff screenshot regression. Use it for visual rendering changes; use this skill's ARIA snapshots for semantic-tree regressions and contrast for the a11y-specific color thresholds.
  • ci-cd-integration — running a11y tests in CI and blocking merges on violations.
  • risk-based-testing — prioritizes which pages and components to audit first.

FAQ

What does the accessibility-testing skill do?

Test for WCAG 2.2 AA compliance with axe-core + Playwright, keyboard navigation audits, screen reader testing, ARIA pattern validation, and legal compliance mapping (ADA, EAA, Section 508). Automated tools catch 30-40% of issues — this skill covers automated and manual testing together. Use when: "accessibility," "a11y," "WCAG," "screen reader," "axe," "keyboard navigation," "ARIA," "ADA compliance." Not for: cookie-consent/GDPR compliance — use compliance-testing; pixel-diff visual regression — use visual-testing. Related: playwright-automation, compliance-testing, visual-testing, ci-cd-integration.

How do I install accessibility-testing?

Run npx skills add https://github.com/petrkindlmann/qa-skills --skill accessibility-testing in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/accessibility-testing/ (personal) or .claude/skills/accessibility-testing/ (project).

Which AI agents can use accessibility-testing?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is accessibility-testing safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains accessibility-testing?

It is published by petrkindlmann in petrkindlmann/qa-skills. It has 1,152 recorded installs.

More from petrkindlmann/qa-skills

View all →

playwright-automation

petrkindlmann/qa-skills

Write production-grade Playwright tests in TypeScript: Page Object Model, fixtures, auto-waiting, user-facing locators, parallel execution, CI integration, sharding, and installed-version checks. Includes an explicit "do not" list for AI agents. Use when: "Playwright," "write E2E test," "page object," "new Playwright suite," "Playwright config." Not for: fixing one flaky test at runtime — use test-reliability. Not for: bulk regenerating selectors after a UI refactor — use selector-drift-recovery. Not for: visual baseline creation/management — use visual-testing. Not for: deep WCAG/axe audits — use accessibility-testing. Related: visual-testing, ci-cd-integration, api-testing, test-reliability, selector-drift-recovery, accessibility-testing.

Testing & QA1.9K installs

exploratory-testing

petrkindlmann/qa-skills

Design and execute structured exploratory testing sessions. Covers Session-Based Test Management (SBTM), charter writing, heuristic-based exploration (HICCUPS, FEW HICCUPS), bug discovery patterns, note-taking templates, and conversion of findings to automated tests. Use when: "exploratory testing," "SBTM," "manual testing," "bug hunting," "test charter," "heuristic testing." Not for: an AI browser agent autonomously exploring the app from a natural-language goal — use agentic-browser-testing. Not for: testing your product's own AI/LLM features — use ai-system-testing. Related: test-planning, ai-bug-triage, risk-based-testing, agentic-browser-testing.

Testing & QA1.5K installs

test-strategy

petrkindlmann/qa-skills

Produce a multi-quarter QA strategy document. Covers scope, risk-based prioritization, test levels (unit/integration/E2E), pyramid analysis, entry/exit criteria, quality KPIs, tool selection rationale, CI scaling levers, and timeline planning. Output is an actionable strategy document, not a shelf document. Use when: "test strategy," "QA strategy doc," "testing approach," "QA roadmap," "multi-quarter QA direction." Not for: a single-sprint or single-release plan — use test-planning. Not for: identifying which areas carry the most risk — use risk-based-testing first. Related: risk-based-testing, qa-metrics, release-readiness, test-planning, test-reliability.

Testing & QA1.5K installs

test-planning

petrkindlmann/qa-skills

Build a single sprint or release test plan. Covers feature decomposition into testable scenarios, requirements-to-test coverage mapping, effort estimation by test type, prioritization matrices (risk × effort), resource allocation, and scheduling with buffers. Use when: "sprint test plan," "release test plan," "what to test this sprint," "test estimation," "coverage mapping." Not for: multi-quarter strategy — use test-strategy. Not for: ranking areas by risk — use risk-based-testing. Not for: the go/no-go decision itself — use release-readiness. Related: test-strategy, risk-based-testing, release-readiness.

Testing & QA1.5K installs

qa-project-context

petrkindlmann/qa-skills

Create and fill .agents/qa-project-context.md with the project's tech stack, test frameworks, CI/CD pipeline, environments, quality goals, risk areas, team structure, and conventions. This is the one file every other QA skill reads first, so they skip redundant discovery and give context-aware advice. Use when: "set up QA context," "configure testing," "initialize project," first use of any QA skill. Not for: bootstrapping a brand-new project's QA end-to-end — use qa-start (which calls this skill as its first step). Related: qa-start, risk-based-testing, test-strategy, qa-metrics, playwright-automation.

Testing & QA1.4K installs

risk-based-testing

petrkindlmann/qa-skills

Produce a risk matrix or heatmap that quantifies what could break by business impact × probability, runs failure mode analysis on the top items, and maps test coverage to risk zones. Includes stakeholder interview frameworks and continuous reassessment. Run this BEFORE test-strategy or test-planning. Use when: "risk assessment," "risk matrix," "risk heatmap," "what could break," "critical paths," "failure modes," "where to focus testing." Not for: multi-quarter QA direction — use test-strategy. Not for: a single sprint/release test plan — use test-planning. Not for: hands-on session-based bug hunting — use exploratory-testing. Related: test-strategy, test-planning, release-readiness, qa-metrics.

Testing & QA1.4K installs

Popular testing & qa skills

View category →

tdd

mattpocock/skills

Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.

Testing & QA1.2M installs

grilling

mattpocock/skills

Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.

Testing & QA996.2K installs

migrate-to-shoehorn

mattpocock/skills

Migrate test files from as type assertions to @total-typescript/shoehorn. Use when user mentions shoehorn, wants to replace as in tests, or needs partial test data.

Testing & QA484.1K installs

run-train

lllllllama/rigorpilot-skills

Rigor Train skill for deep learning research repositories. Use when a documented or selected training command should be run conservatively for startup verification, short-run verification, full kickoff, or resume, with command, config, seed, log, checkpoint, status, and metric evidence written to standardized trainoutputs/. Do not use for environment setup, exploratory sweeps, speculative idea implementation, or end-to-end orchestration.

Testing & QA337.8K installs

test-driven-development

obra/superpowers

Use when implementing any feature or bugfix, before writing implementation code

Testing & QA261.8K installs

Use when implementation is complete, all tests pass, and you need to decide how to integrate the work

Testing & QA216.8K installs