axe-core - Quick Reference
When NOT to Use This Skill
-
Manual WCAG compliance audits - Use the wcag skill for understanding guidelines and manual testing
-
Screen reader testing - axe-core doesn't replace manual screen reader verification
-
Complex ARIA pattern implementation - Use wcag skill for ARIA authoring practices
-
Accessibility strategy planning - This is for test automation, not accessibility consulting
Deep Knowledge: Use mcp__documentation__fetch_docs with technology: axe-core for comprehensive documentation on rules, configuration, and integrations.
Setup Base
npm install -D @axe-core/react # For React npm install -D axe-core # Core library
Pattern Essenziali
React DevTools Integration
import React from 'react'; import ReactDOM from 'react-dom/client';
if (process.env.NODE_ENV !== 'production') { import('@axe-core/react').then(axe => { axe.default(React, ReactDOM, 1000); }); }
Jest/Vitest Integration
import { axe, toHaveNoViolations } from 'jest-axe';
expect.extend(toHaveNoViolations);
test('should have no accessibility violations', async () => { const { container } = render(<MyComponent />); const results = await axe(container); expect(results).toHaveNoViolations(); });
Playwright Integration
import { test, expect } from '@playwright/test'; import AxeBuilder from '@axe-core/playwright';
test('should not have accessibility issues', async ({ page }) => { await page.goto('/');
const accessibilityScanResults = await new AxeBuilder({ page }).analyze();
expect(accessibilityScanResults.violations).toEqual([]); });
// With specific rules test('should pass WCAG AA', async ({ page }) => { await page.goto('/');
const results = await new AxeBuilder({ page }) .withTags(['wcag2a', 'wcag2aa']) .analyze();
expect(results.violations).toEqual([]); });
Cypress Integration
// cypress/support/commands.ts import 'cypress-axe';
// In test describe('Accessibility', () => { it('has no violations', () => { cy.visit('/'); cy.injectAxe(); cy.checkA11y(); }); });
Programmatic Usage
import axe from 'axe-core';
async function checkAccessibility() { const results = await axe.run();
if (results.violations.length > 0) { console.log('Violations:', results.violations); } }
Anti-Patterns
Anti-Pattern Why It's Wrong Correct Approach
Running axe on empty/loading states Tests incomplete DOM, false negatives Wait for content to load before running axe
Ignoring all violations Defeats purpose of automated testing Fix violations or document exceptions with reasoning
Testing only homepage Most accessibility issues in complex interactions Test all critical user flows and components
Not configuring WCAG level Tests against all rules, may be too strict Set withTags(['wcag2a', 'wcag2aa']) for target level
Running axe synchronously in loops Slow test execution Use Promise.all() for parallel execution
Committing violations to CI Prevents catching regressions Fail builds on new violations
Testing hidden/inactive components Axe tests invisible elements unnecessarily Use exclude parameter for hidden sections
No baseline for legacy code All violations block progress Create baseline, track improvements incrementally
Quick Troubleshooting
Issue Diagnosis Solution
axe finds no violations but page is inaccessible Automated tools catch only ~30-40% of issues Supplement with manual keyboard and screen reader testing
"No violations" but form has issues axe doesn't test form logic/flow Test form submission, error handling manually
Timeout in Playwright axe tests Large/complex page takes too long Increase timeout or analyze specific regions
False positive on custom component axe rule doesn't understand pattern Use disableRules or add proper ARIA to fix
Violations in third-party widgets Can't modify external code Document exceptions, contact vendor, or replace widget
Different results in different browsers Browser-specific rendering differences Run axe in multiple browsers, use cross-browser test suite
CI fails but local passes Environment differences (timing, content) Ensure consistent test data and wait conditions
Too many violations to fix at once Legacy codebase with extensive issues Create baseline, use --save flag to track improvements