Skip to content
A11y-PulsePublic

About

Automated interaction-driven web accessibility testing

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

22 stars

Watchers

3 watching

Forks

Repository files navigation

A11y Pulse Logo

Lint Release npm version npm downloads License: PolyForm Shield

Automated interaction-driven web accessibility testing

A collection of audits that are designed to complement static analysis tools like axe-core and HTML_CodeSniffer. They work by simulating user interaction through a real web browser, allowing them to test against WCAG success criteria that static analysis tools cannot.

Made with ❤️ by the A11y Pulse team in New Zealand.

Running npx @a11y-pulse/audit-runner https://who.likesdogs.nz/ --format simple. A spinner steps through launching Chrome, loading the page, running axe-core and each A11y Pulse audit, then three failed audits are listed with their impact, description, selector and HTML.

Coverage

Success criterion A11y-Pulse/audits axe-core pa11y (HTML_CodeSniffer)
1.1.1 Non-text Content (A) ✅ 🟡1 ➖2
1.4.1 Use of Color (A) ✅ 🟡3 ➖2
1.4.10 Reflow (AA) ✅ ❌ ➖2
1.4.12 Text Spacing (AA) ✅ 🟡4 ➖2
2.1.2 No Keyboard Trap (A) ✅ ❌ ➖2
2.4.1 Bypass Blocks (A) ✅ 🟡5 ➖2
2.4.6 Headings and Labels (AA) ✅ ❌ ➖2
2.4.7 Focus Visible (AA) ✅ ❌ ➖2
2.4.11 Focus Not Obscured (AA) ✅ ❌ ❌
3.2.1 On Focus (A) ✅ ❌ ➖2
1. The `image-alt` audit and its relatives only check that a text alternative exists.
2. Manual review only: emits a note asking a human to check the criterion.
3. The `link-in-text-block` audit only checks that links are distinguishable from the surrounding text.
4. The `avoid-inline-spacing` audit only flags inline `!important` spacing declarations.
5. The `bypass` audit only checks that a bypass mechanism exists, not that it works.

Quick Start

The @a11y-pulse/audit-runner package is a simple command line tool to run the audits against a single URL:

npx @a11y-pulse/audit-runner https://example.com/

It also serves as an implementation reference for integrating the audits in your own automation pipeline. Individual audits can also be used on their own - see the README in each package for details.

Packages

Package What it checks
@a11y-pulse/focus-appearance-audit WCAG 2.4.7 Focus Visible: tabs through a page and detects a visible focus indicator. Also flags indicators that rely on colour alone (WCAG 1.4.1 Use of Color)
@a11y-pulse/focus-not-obscured-audit WCAG 2.4.11 Focus Not Obscured (Minimum): tabs through a page and detects focused elements entirely hidden behind other content
@a11y-pulse/context-change-on-focus-audit WCAG 3.2.1 On Focus: tabs through a page and detects focus-triggered context changes (new windows, auto-submits, navigation, focus theft/removal)
@a11y-pulse/keyboard-trap-audit WCAG 2.1.2 No Keyboard Trap: tabs through a page, detects focus confined to part of it, and tries the standard keyboard exits before reporting a trap
@a11y-pulse/filename-alt-text-audit WCAG 1.1.1 Non-text Content: flags image alt text that is the image's own filename, a camera file name or placeholder text
@a11y-pulse/focus-order-audit WCAG 2.4.3 Focus Order: tabs through a page and flags focus that repeatedly jumps a long way against the reading order, for human review
@a11y-pulse/orphaned-tab-roles-audit WCAG 1.3.1 Info and Relationships and 4.1.2 Name, Role, Value: flags tabs with no tab panel, tab panels with no tab, and navigation links given the tab role
@a11y-pulse/suspicious-accessible-name-audit WCAG 2.4.6 Headings and Labels, 2.4.4 Link Purpose and 1.1.1 Non-text Content: flags accessible names that are code, an unrendered template token or placeholder text
@a11y-pulse/reflow-audit WCAG 1.4.10 Reflow: narrows to 320px and checks for content that requires horizontal scrolling
@a11y-pulse/skip-link-audit WCAG 2.4.1 Bypass Blocks: verifies that skip links are present and functional
@a11y-pulse/text-spacing-audit WCAG 1.4.12 Text Spacing: applies extra spacing and detects clipped or overlapping text
@a11y-pulse/browser-adaptor Shared browser adaptor primitives (BrowserAdaptor, PuppeteerAdaptor) and DOM helpers (getSelector, truncateHtml) used by audit packages
@a11y-pulse/tab-orchestrator Orchestrator that drives a page once so multiple tab-driven audits can share a single tab loop
@a11y-pulse/audit-runner CLI that runs axe-core and all A11y Pulse audits

Licence

The packages in this repository are split into two licence categories:

  • The audit packages are PolyForm Shield 1.0.0. This means they are source-available and can be used freely, including commercially and in your own internal monitoring, as long as you are not building something that competes with A11y Pulse.
  • The plumbing packages are MIT. browser-adaptor, tab-orchestrator, and audit-runner can all be used freely with almost no restrictions.

Please read the LICENSE.md file for each package to understand the specific terms of use.

Contributing

Adaptors, new criteria and accuracy fixes are all welcome. See CONTRIBUTING.md for Changesets and pull-request expectations, and the open issues for work that is ready to pick up.

Requires Node.js >=22.

git clone https://github.com/A11y-Pulse/audits.git
cd audits
npm install
npm test                 # typecheck + unit tests
npm run test:integration # real Chromium via Puppeteer
npm run lint

About A11y Pulse

A11y Pulse is a web accessibility monitoring platform. It scans websites for accessibility issues using real web browsers, making it easier to reach WCAG compliance and maintain accessibility over time. A11y Pulse combines these audits with other open-source accessibility testing frameworks to provide more coverage than most other tools.

About

Automated interaction-driven web accessibility testing

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

22 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages