Axe DevTools for Web for Node.js and Browser-based Testing
Overview of the Node.js and JavaScript integrations available with Axe DevTools for Web
This page presents you with options for Node.js and JavaScript development with Axe DevTools for Web. Each entry below names the npm package it documents, so you can match a package you have seen referenced to its guide.
Every package listed below ships its own TypeScript type declarations, so there is no separate @types/ package to install and the Axe DevTools API is the same in both languages. The importing and writing tests guides for each integration label their examples by language and give a complete sample file in both JavaScript and TypeScript.
All of these packages install from the same registry. See Install Axe DevTools for Web for Node.js from Deque's Agora for authentication and installation instructions.
Whichever package you choose, scans run against WCAG 2.1 Level AA by default, with best-practice and experimental rules turned off. See Customizing Rules to change the ruleset or enable best practices.
Test framework integrations
Choose the package that matches the tool your tests already use. Each guide covers installation, importing and initializing, writing tests, and the full API reference.
- Browser JavaScript (
@axe-devtools/browser) - Cypress (
@axe-devtools/cypress) - Playwright JavaScript (
@axe-devtools/playwright) - Puppeteer (
@axe-devtools/puppeteer) - WebdriverIO (
@axe-devtools/webdriverio) - WebDriverJS (
@axe-devtools/webdriverjs)
Reporting and logging
These packages work alongside any of the test framework integrations above.
- Node Reporter (
@axe-devtools/reporter): generates reports from your accessibility results. - Node Logger (
@axe-devtools/logger): logs accessibility results as your tests run.
Other integrations
Custom Elements and ElementInternals
Starting in Axe DevTools for Web 4.13.0, scans read the ARIA semantics that web components declare in JavaScript through ElementInternals, rather than only the role and aria-* attributes present in the markup. No configuration is required, and this applies to every integration on this page. Semantics in the DOM still take precedence: an explicit role or aria-* attribute on the element overrides the value from ElementInternals.
Your components must publish their internals for any of this to take effect, and a component that stores them in a private class field cannot be read. See Testing Custom Elements That Use ElementInternals.
