Authors and runs axe-core accessibility scans - the most-deployed open-source a11y engine - via the `axe.run()` JavaScript API or the @axe-core/playwright / @axe-core/cli wrappers, parses the `violations[]` results into per-rule severity (critical / serious / moderate / minor), configures rule disable / disable-by-tag patterns, and emits JUnit-shaped output for CI gating. Use when the project ships UI tests in JavaScript / TypeScript and wants automated a11y coverage on every PR.
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
axe.run() resolves to an object with four arrays (axe-core):
| Field | Meaning |
|---|---|
violations | Definite issues - block this in CI. |
incomplete | Items needing human review (axe couldn't determine). |
passes | Successful checks. |
inapplicable | Rules that don't apply to this page. |
Each violation has:
| Field | Meaning |
|---|---|
id | Rule ID (e.g. color-contrast, label, aria-required-attr). |
impact | critical / serious / moderate / minor. |
tags | Includes wcag2a, wcag22aa, etc. - for severity-by-SC tagging. |
description | One-line explanation. |
help | Longer remediation guidance. |
helpUrl | Direct link to Deque's rule documentation. |
nodes | Array of failing elements with target (selector), html, failureSummary. |
Triage with jq:
# Top violations by impact
jq -r '.violations[] | "\(.impact): \(.id) - \(.description)"' axe-results.json
# Just the failing selectors per rule
jq -r '.violations[] | "\(.id):", (.nodes[].target | tostring)' axe-results.jsonaxe ships rules tagged with conformance levels:
new AxeBuilder({ page }).withTags(['wcag2a', 'wcag2aa', 'wcag22aa'])Common tag sets:
| Tag set | Coverage |
|---|---|
['wcag2a', 'wcag2aa'] | WCAG 2.0/2.1 A + AA. Default for most teams. |
['wcag2a', 'wcag2aa', 'wcag22aa'] | Adds WCAG 2.2 AA criteria. |
['wcag2aaa'] | AAA-only (rarely the gate). |
['best-practice'] | Non-WCAG good practices. |
['experimental'] | Beta rules. |
new AxeBuilder({ page }).disableRules(['color-contrast'])For per-page disabling (e.g. a known false positive on a specific component):
new AxeBuilder({ page })
.exclude('.legacy-component') // selector exclusion
.analyze();For per-rule severity in CI gating (e.g. block on critical /
serious only): handle in a11y-violation-gate using the impact
field.