Direct answer: of 25 homepages, 16 rendered successfully; nine returned 403, a challenge page or under 2 KB and are excluded. Across the 16, aria-* attributes rise from 13 in static HTML to 172 after rendering (seven sites), roles from 3 to 84 and aria-hidden from 1 to 35 (three sites); tabbable elements inside aria-hidden go from 0 to 4 (two sites) and dangling ID references from 0 to 5 (one site); H1s rise from 27 to 29 (two sites, one gaining its first H1); main stays at 3 of 16, with no nav/header/footer change; iframes 3→5 and scripts 270→323 (12 sites up, one down).

This study compares static HTML with the DOM serialized by headless Chrome; it does not judge visuals, contrast or screen-reader output.

16
rendered
13→172
ARIA attributes
0→4
hidden tabbable
3
with main
8→7
no-H1 sites
9
excluded

Method: counting the same page twice

On 2026-11-09 between 01:45 and 01:48 we requested the static HTML of the same 25 cached-200 homepages, then serialized the rendered DOM with headless Chrome (--headless=new --dump-dom, 15-second virtual time, a separate profile per site). Both passes use the same parsers for landmarks, H1s, ARIA, tabbable elements and ID references, and the results are differenced item by item.

MeasureDefinitionBoundary
RenderedChrome output contains <html>, exceeds 2 KB and is not an error page403 or challenge pages are not counted as zero
Tabbablebutton/input/select/textarea/summary, a[href]; with tabindex, value ≥ 0tabindex="-1" excluded
ARIA attributesCount of aria-* in the serialized DOMStatic DOM only, not the accessibility tree
Dangling ID referencesaria-labelledby/controls/owns pointing at IDs absent from the documentExistence check only

Result: 159 more ARIA attributes, zero landmark injection

MeasureStaticRenderedSites increasing
Pages with main330
H1s in total27292
Sites without H187—
aria-* attributes131727
role attributes3847
aria-hidden="true"1353
Tabbable elements inside aria-hidden042
Dangling ID references051
iframes352
scripts27032312 (one down)

The increase is concentrated. E02 grows from 209 KB to 1,410 KB (6.7×), with ARIA 0→29, roles 0→19, aria-hidden 0→9, hidden tabbable 0→3 and dangling references 0→5; E11 goes from 0 to 23 aria-hidden, but all 44 descendants carry tabindex="-1" and are outside the Tab sequence, so they are excluded; E25 grows from 287 KB to 464 KB with ARIA 6→11 and one hidden tabbable element. E18 has no H1 and a single script in static HTML, then gains an H1 and an iframe after rendering while growing from 15.7 to 66.8 KB; E17 moves from 2 to 3 H1s and from 7 to 33 ARIA attributes.

Why this changes acceptance

  • Static scans undercount ARIA. 92.4% of the aria-* attributes in the 16 sites (159 of 172) exist only after rendering; source-only review misses the whole block.
  • The worst findings exist only after rendering. Four tabbable elements inside aria-hidden and five dangling references are all zero in static HTML.
  • JavaScript does not add landmarks. main / nav / header / footer see no injection across the 16 sites; main remains 3 of 16 and H1s grow by only two.
  • Weight growth is concentrated. The 16 sites grow from 1.23 MB to 2.79 MB in total, and E02 alone adds 1.2 MB.

What this means for acceptance

  1. Run semantic checks twice: static and rendered DOM. Static-only review would miss 159 ARIA attributes and all four hidden tabbable elements.
  2. Make aria-hidden × tabbable a priority check. Four elements across two sites can send keyboard users into an invisible region.
  3. Automate dangling references. All five appear only after rendering, so manual spot checks rarely find them.
  4. Do not expect JavaScript to add H1s or landmarks. Only two sites gain an H1 and landmarks see zero injection; template gaps still need template fixes.
  5. List render failures separately. Nine sites returned 403 or a challenge page and must not be treated as “no ARIA”. See the website development service.

Limits

  • 16 of 25: nine sites did not render (403, challenge page, under 2 KB) and are excluded rather than counted as zero.
  • Render window: headless Chrome with 15 seconds of virtual time cannot see later asynchronous work; without interaction, collapsed menus may differ from real browsing.
  • Tabbable is a heuristic: no real Tab sequence, no iframe internals or shadow DOM; tabindex="-1" is excluded.
  • DOM only: screen-reader output, contrast and focus visibility are not judged.
  • 25-site pilot: the same equipment-company sample; no industry claim.

Data and reproduction

Anonymised data: equipment-homepage-rendered-dom-2026.csv (25 rows × 30 columns: static and rendered counts per measure, page KB, render status and time). The repository keeps docs/research/2026-11-homepage-rendered-dom.csv.

Parsers: scripts/aria_probe.py, scripts/semantic_structure_probe.py and scripts/dom_delta.py; tests: test_content_aria_probe.py (16), test_semantic_structure_probe.py (9) and test_content_dom_delta.py (5, all offline). Run:

python -m unittest scripts.test_content_aria_probe scripts.test_semantic_structure_probe scripts.test_content_dom_delta

Related: homepage semantics, keyboard access and ARIA (static definitions), the homepage focus-style recheck, and the homepage link structure pilot.

Sources and definitions

  1. Sample: the 25 study-4 homepages that were cached as 200.
  2. Static: 2026-11-09 01:45–01:48, serial live requests with a 15-second timeout.
  3. Rendered: headless Chrome --dump-dom, 15-second virtual time, a separate profile per site.
  4. Excluded: nine sites returning 403, a challenge page or under 2 KB.
  5. Definitions: tabbable = naturally focusable or tabindex ≥ 0; aria-hidden coverage follows the ancestor chain.

Frequently asked questions

Why only 16 sites?

Nine of the 25 did not render: they returned 403, a challenge page or under 2 KB of output. They are excluded and not counted as zero ARIA.

Does ARIA going from 13 to 172 make the sites more accessible?

Not necessarily. Quantity is not correctness: the same rendered set contains four tabbable elements inside aria-hidden and five dangling ID references, problems that only appear after rendering.

Does JavaScript add H1s and landmarks?

Barely in this sample: only two sites gain an H1 after rendering (one from zero), and main / nav / header / footer see zero injections across the 16 sites.

Why does E11's 44 elements not count as hidden tabbable content?

They all carry tabindex="-1" and are outside the Tab sequence. This study counts only elements keyboard Tab can reach; scripted focus is a separate test.

Can tabindex="-1" still receive focus from JavaScript?

Yes, programmatic focus is possible, but the element is not in the keyboard Tab order, so it is excluded from the tabbable definition used here.

Can the data be re-checked?

Yes. The public CSV has 25 rows by 30 columns, and scripts/aria_probe.py, semantic_structure_probe.py and dom_delta.py carry 30 offline unit tests.

About the author

Lingyi Information Official (delivery team) works on requirements, proposals and acceptance for corporate websites, brand and smart-manufacturing projects. This article compares static HTML with the DOM rendered by headless Chrome; it does not judge visuals, contrast or screen-reader output and is not a verdict on any site. The 16 rendered sites are a pilot.

Beyond the source

Source review sees half the picture: ARIA, dangling references and hidden tabbable elements often appear only after JavaScript runs.

Request a recheck plan