Learn to scan web applications for WCAG 2.2 accessibility violations using axe-core, IBM Equal Access, and custom Playwright checks.
View the Project on GitHub devopsabcs-engineering/accessibility-scan-workshop
| Duration | 25 minutes |
| Level | Beginner |
| Prerequisites | Lab 00 |
By the end of this lab, you will be able to:
The scanner repository includes 5 deliberately inaccessible web applications, each built with a different technology stack. All 5 apps share the same core WCAG violations but use different themes.
Review the demo app matrix:
| App | Language | Framework | Theme | Port | Violation Categories |
|---|---|---|---|---|---|
| 001 | Rust | Actix-web | Travel Booking | 8001 | Missing lang, no title, popup trap, keyboard trap, no focus indicator, poor contrast, heading hierarchy, marquee/blink, no labels, no table headers, ambiguous links |
| 002 | C# | ASP.NET 8 | E-Commerce Store | 8002 | All of 001 + inaccessible tab interface, inaccessible image map |
| 003 | Java | Spring Boot | Online Learning | 8003 | Same core violations as 001 with education-themed content |
| 004 | Python | Flask | Recipe Site | 8004 | Same core violations as 001 with recipe-themed content |
| 005 | Go | net/http | Fitness Tracker | 8005 | Same core violations as 001 with fitness-themed content |
Note that all 5 apps intentionally include 15+ WCAG violation categories. These are your test targets throughout the workshop.
You will build and run the first demo app locally to explore its violations.
Build the Docker image for demo app 001:
docker build -t a11y-demo-app-001 ./a11y-demo-app-001
Run the container:
docker run -d --name a11y-001 -p 8001:8080 a11y-demo-app-001
Open your browser and navigate to:
http://localhost:8001
You should see the TravelNow Bookings travel site.

[!TIP] To build and run additional demo apps, repeat the pattern with the appropriate directory and port:
docker build -t a11y-demo-app-002 ./a11y-demo-app-002 docker run -d --name a11y-002 -p 8002:8080 a11y-demo-app-002
You will explore demo app 001 and identify accessibility violations you can see without any tools.
When the page loads, notice the popup modal that appears. Try pressing Tab or Escape — the modal cannot be closed with the keyboard.

Close the modal by clicking the X button with your mouse. Then observe the following:
<h4> to <h1> to <h6>, violating logical heading order.<marquee> banner creates distracting motion.F12) and run a Lighthouse Accessibility Audit:

WCAG 2.2 organizes accessibility requirements into 4 principles known as POUR. You will map the violations you found to these principles.
Review the POUR principles and their demo app examples:
| Principle | Description | Demo App Examples |
|---|---|---|
| Perceivable | Information must be presentable in ways users can perceive | Missing alt text (1.1.1), poor contrast (1.4.3), tiny text (1.4.4) |
| Operable | UI components must be operable by all users | Keyboard trap (2.1.2), no skip nav (2.4.1), no page title (2.4.2), ambiguous links (2.4.4), marquee/blink (2.3.1) |
| Understandable | Information and UI operation must be understandable | Missing lang attribute (3.1.1), no form labels (3.3.2) |
| Robust | Content must be robust enough for assistive technologies | Deprecated elements like <font> and <marquee> (4.1.1), divs as buttons without ARIA roles (4.1.2) |

For each violation you identified in Exercise 1.3, determine which POUR principle it falls under. Most demo app violations span all 4 principles.
[!NOTE] WCAG 2.2 Level AA has 55 success criteria across these 4 principles. The demo apps violate criteria from every principle, making them comprehensive test targets for the scanner tools you will use in Labs 02–04.
Before proceeding, verify:
http://localhost:8001Proceed to Lab 02: axe-core — Automated Accessibility Testing.