Lesson 17 of 30
Automated tools are a fast, cheap, CI-enforceable floor — they catch a real chunk of accessibility bugs, and they will never catch all of them.
12 min read
Every option explains itself — why the right one is right, and why each wrong one is wrong. Miss one and it comes back later on a spaced-repetition schedule.
Question 1 of 3
What's the practical difference between what eslint-plugin-jsx-a11y catches and what axe-core catches?
Hints without spoilers, and a plain explanation of why a wrong answer was wrong — answered only from this lesson. Free account, no card.
Sign up freeWhat interviewers actually ask about this, and what a strong answer has to cover.
A strong answer covers
Likely follow-ups
Two tools cover most of the real automated accessibility toolkit, and they catch problems at two different points in the workflow.
axe-core is an open-source accessibility testing engine that inspects rendered markup and reports specific, rule-based violations — missing form labels, insufficient contrast, invalid ARIA attribute values, images missing alt text. It runs in several places: directly in automated tests via a test-runner integration like @axe-core/playwright, as a standalone browser extension for spot-checking a page manually, or wired into CI so a pull request fails on a real violation instead of relying on someone remembering to check. This app, Praxis, actually uses axe-core this way as part of its own verification workflow — a concrete example of automated accessibility testing running against real, shipped UI rather than a toy example.
eslint-plugin-jsx-a11y catches a different, earlier subset of issues — at write-time, before the code even runs. A missing alt prop on an img, an interactive div with a click handler but no keyboard handler, a form label with no associated control: these show up as lint errors the moment they're typed, which is the cheapest possible point to catch a mistake, well before a test run or a code review.
// eslint-plugin-jsx-a11y flags this at write-time, before it ever runs:
<div onClick={handleSelect}>Select plan</div>
// → "Visible, non-interactive elements with click handlers must have
// at least one keyboard listener" (jsx-a11y/click-events-have-key-events)
// axe-core flags this at test/runtime, against rendered DOM:
<img src="/chart.png" />
// → "Images must have alternate text" (image-alt)
Both are real, valuable, and neither is close to sufficient on its own. Their honest, well-documented limitation — stated plainly by both tools' own maintainers and echoed across accessibility practice broadly — is that automated tools reliably catch mechanically checkable issues: things with an objectively correct answer, like whether an alt attribute exists or whether a contrast ratio meets a numeric threshold. Commonly cited estimates put automated coverage at roughly a third to half of real WCAG issues, not all of them. Whether an error message is actually understandable, or a tab order is actually logical, requires human judgment no automated rule can fully encode — there's no lint rule for "this instruction makes sense to a first-time user."
eslint-plugin-jsx-a11y catches structural mistakes before code ships at all; @axe-core/playwright-style CI checks catch rendering-time issues a linter can't see (computed contrast, dynamically-generated markup)."We run automated accessibility tests — are we covered?" is a real trap question, and the strong answer names the actual limitation precisely (mechanically-checkable issues only, roughly a third to half of real problems) rather than either overclaiming coverage or dismissing automated tools as pointless.