plugins/accessibility/skills/testing/SKILL.md
Accessibility testing: full WCAG 2.2 AA checklist, manual testing methodology, 10 Python audit scripts (stdlib-only), common issues reference table.
npx skillsauth add lukeslp/accessibility-skills testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Complete accessibility testing toolkit. Includes the full WCAG 2.2 AA checklist, manual testing methodology, all 10 Python audit scripts, and a common issues reference table.
Related skills:
/accessibility:motor(motor patterns),/accessibility:visual(contrast, alt text),/accessibility:cognitive(plain language, reduced motion),/accessibility:screen-reader(semantic structure, ARIA)
Use this as a quick audit checklist when reviewing any interface. Includes WCAG 2.2 criteria (marked with 2.2).
alt="" for decorative)<html lang="en"> (or appropriate language) is setautocomplete attributes (1.3.5)Automated tools catch about 30% of accessibility issues. Manual testing is essential.
# Lighthouse (built into Chrome DevTools)
npx lighthouse <url> --only-categories=accessibility
# axe-core (more thorough)
npx @axe-core/cli <url>
# pa11y (CI-friendly)
npx pa11y <url>
This skill includes 14 standalone Python scripts (stdlib only — no pip install needed) for targeted audits. All accept HTML files as arguments and support --format json for CI integration.
| Script | Domain | What it checks |
|--------|--------|---------------|
| contrast-checker.py | Visual | WCAG contrast ratio between two hex colors |
| cvi-contrast-check.py | CVI / Low vision | CVI-safe contrast (10:1+), photophobia, deuteranopia presets |
| alt-text-audit.py | Visual / SR | Missing, empty, or suspicious alt text on images |
| heading-outline.py | Cognitive / SR | Heading hierarchy — skipped levels, missing h1, empty headings |
| landmark-audit.py | SR | ARIA landmark structure — missing main, unlabeled duplicates |
| link-text-audit.py | SR / Cognitive | Vague link text ("click here"), empty links, image-only links |
| focus-order-check.py | Motor / Keyboard | Positive tabindex, non-focusable interactive elements, aria-hidden conflicts |
| target-size-check.py | Motor | Undersized touch targets (WCAG 2.5.8: 24px AA, 44px AAA) |
| color-only-check.py | Color blindness | Patterns where color is the sole information carrier |
| timing-audit.py | Motor / Cognitive | setTimeout, autoplay, animations without reduced-motion support |
| form-label-audit.py | SR / Cognitive | Missing form labels or accessible names (aria-label) |
| language-audit.py | SR | Presence and validity of lang attribute on <html> element |
| duplicate-id-check.py | SR / Robustness | Duplicate IDs that break ARIA associations |
| table-accessibility-audit.py | SR | Table headers (<th>), scope attributes, and captions |
# Run individual checks
python3 scripts/contrast-checker.py "#333333" "#f5f5f5"
python3 scripts/cvi-contrast-check.py --preset cvi
python3 scripts/alt-text-audit.py index.html
python3 scripts/heading-outline.py index.html
python3 scripts/landmark-audit.py index.html
python3 scripts/link-text-audit.py index.html
python3 scripts/focus-order-check.py --show-all index.html
python3 scripts/target-size-check.py --threshold 44 index.html
python3 scripts/color-only-check.py index.html
python3 scripts/timing-audit.py index.html app.js styles.css
# Run all HTML audits at once
for script in scripts/*-audit.py scripts/*-check.py; do
python3 "$script" index.html
done
# JSON output for CI pipelines
python3 scripts/alt-text-audit.py --format json index.html | jq '.issues'
prefers-reduced-motion in your OS or browser dev tools. Do all animations stop?| Issue | Who It Affects | Fix |
|-------|---------------|-----|
| Missing alt text | Screen reader users | Add descriptive alt attribute |
| Low contrast text | Low vision, aging eyes | Increase to 4.5:1 ratio |
| No focus indicator | Keyboard/switch users | Add :focus-visible outline (3px+) |
| Missing form labels | Screen reader users | Associate <label> with for attribute |
| Div-based buttons | All AT users | Use <button> element instead |
| Hover-only content | Motor impaired, touch users | Make content keyboard/touch accessible |
| Auto-playing media | Cognitive, screen reader | Add pause/stop controls, no autoplay |
| Missing skip link | Keyboard/switch users | Add skip link as first focusable element |
| ARIA misuse | Screen reader users | Remove ARIA if native HTML works; validate roles |
| Inaccessible modals | Keyboard/switch users | Use native <dialog> with showModal() — handles focus automatically. For custom modals: trap focus, Escape to close, restore focus on dismiss |
| Small touch targets | Motor impaired, tremor | Minimum 24x24px (WCAG 2.2 AA), 44x44px preferred, 48px on mobile |
| Actions on pointer down | Motor impaired, tremor | Use click events (up-event), not mousedown/touchstart — allows cancellation by moving away |
| Hover-only menus | Eye gaze, switch users | Open menus on click/Enter, not hover. Hover menus fire accidentally with dwell-click |
| Inconsistent layout | Motor impaired, cognitive | Keep navigation and key actions in fixed positions across all pages — muscle memory matters |
tools
Visual accessibility: contrast ratios, color independence, CVI/photophobia/color blindness, alt text (4 styles), forced colors, text scaling. WCAG 2.2 AA.
development
Screen reader compatibility: semantic HTML, landmarks, headings, ARIA live regions, forms, data tables, dynamic content. WCAG 2.2 AA.
development
Motor accessibility patterns from AAC development: touch targets, keyboard navigation, switch access, eye gaze, fatigue detection, pointer gestures. WCAG 2.2 AA.
data-ai
Cognitive and communication accessibility: plain language, dyslexia-friendly text, reduced motion, error prevention, memory support, captions, AAC integration. WCAG 2.2 AA.