WCAGpilot Worker Test Fixtures
How to test
HTML-parsing workers accept the page markup directly in the request body, e.g.:
POST https://api.wcagpilot.com/w/headings with { "html": "<the page source>" }
URL-fetching workers (axe, keyboard-focus, reflow) need a live public URL — deploy this folder, then pass the deployed page URL, e.g. { "pages": [{ "url": "https://YOUR-HOST/axe/all-bad.html" }] }.
Headings
| Fixture | Expected | Check |
|---|---|---|
| good-structure.html | PASS | One H1 first, clean hierarchy, no empty headings |
| no-headings-bad.html | WARNING | presence — no headings |
| no-h1-bad.html | WARNING | h1_first — no H1 |
| multiple-h1-bad.html | WARNING | h1_first — multiple H1 |
| skipped-level-bad.html | WARNING | hierarchy — H1 jumps to H3 |
| empty-heading-bad.html | FAIL | empty_headings |
| aria-no-level-bad.html | FAIL | aria_misuse — role=heading, no aria-level |
| heading-in-button-bad.html | FAIL | aria_misuse — heading inside button (F43) |
| visual-heading-bad.html | FAILAI | visual_headings (F2) |
| semantic-mismatch-bad.html | FAILAI | content_match |
| all-bad.html | FAIL | Several issues combined |
| all-good.html | PASS | Full clean outline |
Dynamic rendering
| Fixture | Expected (rendered) | Check |
|---|---|---|
| webcomponents-good.html | PASS | Clean outline inside shadow DOM |
| webcomponents-bad.html | FAIL | Empty heading + skipped level in shadow DOM |
| spa-good.html | PASS | Clean outline rendered client-side |
| spa-bad.html | FAIL | No h1 + empty heading, rendered client-side |
Page titles
| Fixture | Expected | Check |
|---|---|---|
| descriptive-good.html | PASS | Topic + site name |
| generic-inner-bad.html | FAIL | Brand-only on an inner page |
| placeholder-bad.html | FAIL | "Untitled Document" |
| too-long-warn.html | WARNING | > 70 characters |
| too-short-warn.html | WARNING | < 5 characters |
| all-caps-warn.html | WARNING | ALL CAPS title |
Skip links
| Fixture | Expected | Check |
|---|---|---|
| good.html | PASS | First focusable, visible, target exists |
| sr-only-good.html | PASS | Visually hidden, recovers on focus |
| missing-bad.html | FAIL | No skip link |
| broken-target-bad.html | FAIL | Target id does not exist |
| hidden-bad.html | FAIL | display:none, no focus recovery |
| button-partial.html | PARTIAL | button instead of anchor |
| not-first-partial.html | PARTIAL | Not the first focusable element |
| all-bad.html | FAIL | No skip link and no main landmark |
Forms
| Fixture | Expected | Check |
|---|---|---|
| label-for-good.html | PASS | label[for] |
| label-wrap-good.html | PASS | Wrapped label |
| aria-label-good.html | PASS | aria-label |
| aria-labelledby-good.html | PASS | aria-labelledby |
| required-both-good.html | PASS | required_match=both |
| group-fieldset-good.html | PASS | fieldset + legend group |
| no-label-bad.html | FAIL | NO_LABEL |
| placeholder-only-bad.html | FAIL | PLACEHOLDER_ONLY |
| title-only-warn.html | WARNING | TITLE_ONLY |
| misleading-bad.html | FAILAI | LABEL_MISLEADING |
| vague-warn.html | WARNINGAI | LABEL_VAGUE |
| required-visual-only-warn.html | WARNING | required_match=visual_only |
| group-no-fieldset-warn.html | WARNING | Group without fieldset/legend |
| all-bad.html | FAIL | Several issues combined |
| all-good.html | PASS | Every field correct |
Media
| Fixture | Expected | Check |
|---|---|---|
| captions-good.html | PASS | captions — track present |
| transcript-good.html | PASS | transcripts — link present |
| audio-description-good.html | PASS | audio_description — track present |
| captions-missing-bad.html | FAIL | captions — native video, no track |
| audio-no-transcript-bad.html | FAIL | transcripts — audio, no link |
| youtube-warn.html | WARNING | captions — platform may provide |
| video-no-transcript-warn.html | WARNING | transcripts — recommended |
| all-bad.html | FAIL | Several issues combined |
| all-good.html | PASS | Captions + transcripts + descriptions |
Keyboard focus
| Fixture | Expected | Check |
|---|---|---|
| default-focus-good.html | PASS | FOCUS_DEFAULT |
| custom-outline-good.html | PASS | FOCUS_REPLACED — custom outline |
| box-shadow-good.html | PASS | FOCUS_REPLACED — box-shadow |
| focus-visible-good.html | PASS | FOCUS_REPLACED — :focus-visible |
| global-outline-none-bad.html | FAIL | FOCUS_REMOVED_GLOBAL |
| scoped-outline-none-warn.html | WARNING | FOCUS_REMOVED_SCOPED |
| no-focusable-na.html | N/A | NA_NO_FOCUSABLE |
| all-bad.html | FAIL | Global removal with many focusables |
Reflow & zoom
| Fixture | Expected | Check |
|---|---|---|
| responsive-good.html | PASS | REFLOW_OK + ZOOM_OK |
| zoom-blocked-bad.html | FAIL | ZOOM_BLOCKED — user-scalable=no |
| maximum-scale-bad.html | FAIL | ZOOM_BLOCKED — maximum-scale=1 |
| fixed-width-bad.html | FAIL | REFLOW_LIKELY_FAIL — >3 fixed widths |
| single-wide-warn.html | WARNING | REFLOW_POSSIBLE — one wide element |
| small-fonts-warn.html | WARNING | ZOOM_SMALL_FONTS |
| all-bad.html | FAIL | Zoom blocked + fixed widths + small fonts |
Alt text
| Fixture | Expected | Check |
|---|---|---|
| decorative-good.html | PASS | EMPTY_DECORATIVE — aria-hidden |
| spacer-good.html | PASS | EMPTY_DECORATIVE — 1x1 spacer |
| redundant-link-good.html | PASS | EMPTY_REDUNDANT_LINK |
| svg-decorative-good.html | PASS | Decorative inline SVG |
| informative-good.html | PASSAI | INFORMATIVE_SHORT — alt matches |
| missing-alt-bad.html | FAIL | No alt attribute |
| functional-no-alt-bad.html | FAIL | FUNCTIONAL_ACTION — icon button, empty alt |
| filename-alt-bad.html | FAIL | Alt is a filename |
| generic-alt-bad.html | FAIL | Generic placeholder alt |
| svg-link-no-name-bad.html | FAIL | SVG-only link, no name |
| background-meaningful-bad.html | FAILAI | Meaningful CSS background |
| vague-alt-warn.html | WARNINGAI | Alt too vague (partial match) |
| complex-chart-warn.html | WARNINGAI | COMPLEX_PLUS_LONGDESC |
| all-bad.html | FAIL | Several issues combined |
| all-good.html | PASS | Decorative + functional + informative done right |
Axe-core
| Fixture | Expected | Rule |
|---|---|---|
| good.html | PASS | No violations |
| missing-lang-bad.html | FAIL | html-has-lang |
| image-alt-bad.html | FAIL | image-alt |
| button-name-bad.html | FAIL | button-name |
| contrast-bad.html | FAIL | color-contrast |
| duplicate-id-bad.html | FAIL | duplicate-id |
| empty-heading-bad.html | FAIL | empty-heading |
| input-label-bad.html | FAIL | label |
| all-bad.html | FAIL | Many rules at once |
Accessibility statement
The discovery worker crawls a homepage for a statement link; the link below gives it a fully parseable page (conformance status, dates, evaluation method, known issues, technologies, contact, enforcement).
- Accessibility Statement — parseable
Page discovery
This index links every fixture above, so the AI page-discovery worker can use it as a homepage to crawl and rank candidate pages.