Page exposed to the accessibility tree
What it checks
aria-hidden="true" on the document body removes the entire page from the accessibility tree. AI browser agents that navigate via the accessibility tree would see nothing at all.
Why it matters
aria-hidden="true" on <body> excludes the element and all its descendants from the accessibility tree, per WAI-ARIA 1.2 §7.1. An agent whose page representation is built from that tree — Playwright MCP browser_snapshot, chrome-devtools-mcp take_snapshot — receives an empty snapshot. It can then neither read nor act on any page content.
Evidence
- WAI-ARIA 1.2 is a W3C Recommendation (06 June 2023); §7.1 “Excluding Elements from the Accessibility Tree” specifies that
aria-hidden="true"removes the element and its descendants from the tree — w3.org/…/wai-aria-1.2 (verified 2026-08-21) - Playwright ARIA snapshots are “a YAML representation of the accessibility tree of a page” — playwright.dev/…/aria-snapshots (verified 2026-08-21)
- Playwright MCP “Uses Playwright’s accessibility tree, not pixel-based input… operates purely on structured data” — github.com/…/playwright-mcp (verified 2026-08-21)
- Chrome DevTools MCP
take_snapshotgives the model “a text snapshot of the currently selected page based on the a11y tree”, and interaction tools address elements only by uids from that snapshot — github.com/…/tool-reference.md (verified 2026-08-21) - axe rule: “Document content is not accessible to assistive technology if
<body aria-hidden="true">” (impact: critical) — dequeuniversity.com/…/aria-hidden-body (verified 2026-08-21)
Limits
Screenshot/pixel-driven agents (computer-use style) are unaffected — they never consult the accessibility tree, so the failure is total for tree-based agents and invisible to vision-based ones. The condition is also vanishingly rare in static HTML. Its realistic occurrence is a modal library setting aria-hidden on the root at open time, which happens only after JS runs — and this pipeline never observes that. A high grade for the signal therefore coexists with a near-zero hit rate for the audit as implemented.
How it scores
WAI-ARIA 1.2 is a ratified W3C Recommendation whose accessibility-tree exclusion is implemented by every browser, and the two documented agent snapshot tools state their representation is that tree, so the empty-page outcome is deterministic rather than inferred.
Sources
- WAI-ARIA 1.2 — aria-hidden — W3C, spec (verified 2026-08-21)
- Live Chromium accessibility snapshot of a probe page (own experiment) — Own experiment via Playwright MCP + Chromium, study (verified 2026-08-21)
- microsoft/playwright-mcp README — Microsoft, vendor-doc (verified 2026-10-20)
- Chrome DevTools MCP — tool reference — Google / Chrome DevTools, repo (verified 2026-08-21)
- axe rule — aria-hidden-body — Deque, vendor-doc (verified 2026-08-21)
- Snapshots — Playwright MCP — Microsoft, vendor-doc (verified 2026-10-20)
- chrome-devtools-mcp tool reference (take_snapshot) — Google / Chrome DevTools, vendor-doc (verified 2026-10-20)
Browser view
Playwright MCP “uses accessibility snapshots instead of screenshots”, with refs “assigned to every node the accessibility tree exposes” (verified 2026-10-20). Chrome DevTools MCP take_snapshot takes “a text snapshot of the target page based on the a11y tree” (verified 2026-10-20). aria-hidden="true" on <body> removes the whole page from that tree, so both snapshots describe an empty page. A supplied browser snapshot is the rendered DOM those tools read, so the browser view runs this audit on it.
The browser view runs on each complete, unredacted, non-loading capture that carries readable text and whose accessibility rule pass completed. The pass runs the audit’s rules over the capture HTML with page scripts off and no resource loading. A pass with no results records missing evidence instead of a verdict. The finding is informative with weight 0. It does not prove HTTP delivery, computed appearance, a complete accessibility tree, live form state, or action success. A truncated, redacted or still-loading capture records missing evidence. Existing implementation limits still apply.
The review appears in Browser-rendered snapshot assessment. The eligibility record lives in packages/core/src/snapshot-eligibility.ts. The crawler grade, tier and weight stay unchanged.