Research · Original test, September 2026
Four accessibility checkers, one page, thirty known defects
We wrote a page with thirty WCAG failures we could name, then ran axe-core, Lighthouse, HTML_CodeSniffer and IBM Equal Access against it. This is what each tool found, what it missed, what it flagged for the wrong reason, and the five defects that no automated checker can find. The fixture is published so you can repeat it.
Updated September 2026Reviewed by The Accessibility.build team
Headline results
- defects found outright by IBM Equal Access, the most of the four
- 19 of 30This benchmark,
- found by axe-core, with 2 more flagged for review
- 16 of 30This benchmark,
- found by Lighthouse, which scored the page 49 out of 100
- 15 of 30This benchmark,
- found by HTML_CodeSniffer via Pa11y
- 12 of 30This benchmark,
- found by all four tools
- 10 of 30This benchmark,
- found by none of them
- 5 of 30This benchmark,
Method
The fixture is a single HTML page containing thirty deliberate defects, each mapped to a WCAG 2.2 success criterion, chosen to span the common failure classes (text alternatives, names and labels, contrast, structure, ARIA, keyboard, timing and media) and to include several that require judgement rather than pattern matching. It was served over HTTP from localhost and each tool was run on 2 September 2026 in headless Chrome 143 with default settings and the WCAG 2.2 AA policy where a tool offers one.
A defect counts as found when the tool reports a violation on the right element for the right reason. A report that only appears in a needs-review or potential category is recorded separately, because most continuous-integration setups fail a build on violations and never surface the rest. A report on the right element for the wrong reason is recorded as wrong.
Download the fixture page and run it yourself. It is marked noindex; each defect is labelled in a comment.
The tools
| Tool | Version | Found | Review only | Wrong reason | Missed | Note |
|---|---|---|---|---|---|---|
| axe-core | 4.13.0 via @axe-core/puppeteer | 16 | 2 | 0 | 12 | Also reported 26 'region' and 2 'landmark-one-main' best-practice findings that are not WCAG failures. |
| Lighthouse | 12.8.2, accessibility category only | 15 | 0 | 0 | 15 | Runs a subset of axe rules. Scored the page 49 out of 100. |
| HTML_CodeSniffer | via Pa11y 10.0.0, WCAG2AA standard | 12 | 0 | 1 | 17 | Reported 17 messages; one was a misclassification of a data table. |
| IBM Equal Access | accessibility-checker 4.0.31, WCAG_2_2 policy | 19 | 3 | 0 | 8 | 20 violations plus 10 potential violations flagged for review. |
Defect by defect
Each result is a word, not a colour: Found, Missed, Review (reported only as needing human review) or Wrong (reported on the right element for the wrong reason).
| ID | Seeded defect | Criterion | axe-core | Lighthouse | HTML_CS | IBM |
|---|---|---|---|---|---|---|
| F01 | No lang attribute on the html element | 3.1.1 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F02 | Image with no alt attribute | 1.1.1 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F03 | First heading is an h3 (skipped levels)axe has a heading-order rule tagged best-practice; it did not fire here. | 1.3.1, 2.4.6 | No: Missed | No: Missed | No: Missed | No: Missed |
| F04 | Grey text on white at 2.85:1 | 1.4.3 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F05 | Small grey text at 4.48:1HTML_CodeSniffer flagged only the first contrast failure. | 1.4.3 | Yes: Found | Yes: Found | No: Missed | Yes: Found |
| F06 | Link text 'click here'A name exists; whether it is a useful name is a judgement no tool makes. | 2.4.4 | No: Missed | No: Missed | No: Missed | No: Missed |
| F07 | Link whose only content is an image with empty alt | 2.4.4, 4.1.2 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F08 | Button with no content | 4.1.2 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F09 | div with onclick, no role, no tabindexIBM's aria_eventhandler_role_valid is the only rule that looks for click handlers on non-controls. | 2.1.1, 4.1.2 | No: Missed | No: Missed | No: Missed | Yes: Found |
| F10 | Text input with no label | 1.3.1, 3.3.2 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F11 | Select with no label | 1.3.1, 3.3.2 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F12 | Label whose for attribute points at nothing | 1.3.1 | No: Missed | No: Missed | No: Missed | Yes: Found |
| F13 | Checkbox with no label | 1.3.1, 3.3.2 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F14 | Submit input with an empty value | 4.1.2 | Yes: Found | Yes: Found | Yes: Found | No: Missed |
| F15 | Table used for data with no header cells (layout markup) | 1.3.1 | No: Missed | No: Missed | No: Missed | Yes: Found |
| F16 | Captioned data table with no header cellsHTML_CodeSniffer flagged this table as a layout table that should not have a caption, which is the opposite of the defect. | 1.3.1 | No: Missed | No: Missed | Wrong: Flagged, wrong reason | Yes: Found |
| F17 | role=button with no tabindexIBM raised it as a potential violation (widget_tabbable_exists). | 2.1.1 | No: Missed | No: Missed | No: Missed | Review: Flagged for review only |
| F18 | role=checkbox with no aria-checked | 4.1.2 | Yes: Found | Yes: Found | No: Missed | Yes: Found |
| F19 | aria-labelledby pointing at a missing idaxe reported it under 'incomplete', which most CI setups ignore. | 4.1.2 | Review: Flagged for review only | No: Missed | No: Missed | Yes: Found |
| F20 | Invalid role value (role=banana) | 4.1.2 | Yes: Found | Yes: Found | No: Missed | Yes: Found |
| F21 | iframe with no title | 4.1.2 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F22 | Focus outline removed in CSSNeeds the element to be focused and its rendered style compared; no static checker does this. | 2.4.7 | No: Missed | No: Missed | No: Missed | No: Missed |
| F23 | Duplicate id attributeaxe 4 dropped its duplicate-id rules; only ids referenced by ARIA are checked now. | 4.1.1 (removed in 2.2) | No: Missed | No: Missed | Yes: Found | No: Missed |
| F24 | marquee element (moving text) | 2.2.2 | Yes: Found | No: Missed | No: Missed | Yes: Found |
| F25 | Two 'Read more' links to different targets | 2.4.4 | No: Missed | No: Missed | No: Missed | No: Missed |
| F26 | Alt text that is the file nameIBM's img_alt_misuse raised it for review. | 1.1.1 | No: Missed | No: Missed | No: Missed | Review: Flagged for review only |
| F27 | Image input with no alt | 1.1.1, 4.1.2 | Yes: Found | Yes: Found | Yes: Found | Yes: Found |
| F28 | Positive tabindex | 2.4.3 | Yes: Found | Yes: Found | No: Missed | No: Missed |
| F29 | Autoplaying video with no captions track | 1.2.2, 1.4.2 | Review: Flagged for review only | No: Missed | No: Missed | Review: Flagged for review only |
| F30 | h1 placed after all the content | 2.4.6 | No: Missed | No: Missed | No: Missed | No: Missed |
What the results mean
The core is shared. Twelve defects were found by all four tools, and they are the ones that matter most in litigation: missing alt text, unlabelled fields, empty buttons and links, untitled frames, low contrast, no page language. These are the failures that appeared in the complaints in Domino's, Winn-Dixie and Target, and any of the four would have caught them.
The edges differ, and IBM covers more of them. Only IBM Equal Access caught the div with a click handler and no role, the label pointing at nothing, and the two tables with no header cells. Only HTML_CodeSniffer caught the duplicate id, a check axe dropped in version 4. Only axe and Lighthouse caught the positive tabindex. Running two engines is cheap and finds more than either alone; IBM plus axe covered 22 of the 30 outright.
Review categories hide real failures. axe put the broken aria-labelledby reference and the uncaptioned video in its incomplete list; IBM put the untabbable widget, the filename alt text and the video in potential violations. A build that fails only on violations never sees these. Read the review lists.
Five defects are invisible to automation, and they are common. Meaningless link text, repeated link text with different targets, a skipped heading level, a page title placed after the content, and a focus outline removed in CSS were missed by every tool. Screen reader users rank nonsensical links and buttons third among their most serious problems, and GDS found lack of visible focus among the top issues in UK public sector monitoring. A clean automated run says nothing about them.
A score is not a measurement. Lighthouse gave this page 49. It found fifteen of thirty defects, and its weighting means the number would move if the same defects were rearranged. WebAIM's 2026 evaluation found a median Lighthouse score of 85 across the top million home pages, 95.9% of which had detectable failures. Use it to spot regressions, not to make a claim.
Noise is a cost. axe reported twenty-eight best-practice findings on a page with no landmarks, all correct and none a WCAG failure. HTML_CodeSniffer reported a captioned data table as a layout table with a caption. Both are the kind of result that trains developers to ignore the report.
Versions and dates are in the tools table. Results apply to this fixture and these versions; every tool updates its rules, and the benchmark will be rerun when they do. For choosing between tools day to day, see axe vs WAVE and automated vs manual testing. WAVE is not in this benchmark because its engine is not available to run locally.
Frequently asked questions
- Which automated accessibility tool finds the most issues?
- On a page with thirty seeded WCAG defects, IBM Equal Access found 19 outright and flagged 3 more for review; axe-core found 16 and flagged 2; Lighthouse found 15; HTML_CodeSniffer found 12. Twelve defects were found by all four, and five were found by none. Coverage is not the only measure: axe produced 28 best-practice findings that are not WCAG failures, and HTML_CodeSniffer misclassified a data table.
- What percentage of WCAG issues can automated tools detect?
- On this fixture, between 40% and 63% of the seeded defects, depending on the tool, and 17% were undetectable by any of them. The undetected ones are the judgement calls: whether link text is meaningful, whether the heading order makes sense, whether focus is visible. Published estimates that automation finds 30% to 57% of issues are consistent with this.
- Is a Lighthouse accessibility score of 100 the same as WCAG conformance?
- No. Lighthouse runs a subset of axe-core's rules and scores them by weight. This fixture scored 49 with fifteen detected failures; a page could score 100 and still fail every judgement-based criterion. WebAIM's 2026 evaluation found a median Lighthouse score of 85 across the top million home pages, of which 95.9% had detectable failures.
- Should I run more than one tool?
- Yes, if the cost is low, because the tools disagree at the edges: only IBM caught the div with a click handler, the orphaned label and the missing table headers; only HTML_CodeSniffer caught the duplicate id; only axe and Lighthouse caught the positive tabindex. But no combination of the four found the five judgement defects, so the second tool you need is a person with a keyboard and a screen reader.
Essential Accessibility Resources
Comprehensive tools, checklists, and guides to help you create inclusive digital experiences