Real-world testing challenges built for AI-assisted automation. Designed for Claude Code, Playwright, and modern QA workflows.
The login form looks simple — but the element classes change every time the page loads. Can you write a test that still finds the right elements?
Click the button and content appears — eventually. Sometimes fast, sometimes slow. Write a test that waits for it reliably every time.
Content loaded successfully!
A three-step form with validation at every stage. Write tests that complete the full journey and catch every error along the way.
Form submitted successfully.
A notification pops up and disappears in seconds. Your test needs to catch it while it's there — then confirm it's gone.
Click the button and it disables itself. Then it comes back. Write a test that handles both states without guessing on timing.
The button keeps moving around the screen. Write a test that catches it — without just getting lucky.
Fill in your email and an extra field might appear — or it might not. Write tests that handle both scenarios correctly.
Two operations run at the same time and only one wins. Write a test that always asserts the right outcome — no matter who finishes first.
The element isn't on the page yet. It only appears after something happens. Write a test that waits for it properly.
I just appeared! Selector:
The login form lives inside an iframe. All interactions must be scoped to that frame.
The form's internals are hidden inside a web component. Most test tools can reach inside — some can't.
Filter by department, sort by salary, assert exact values.
| Name | Department | Salary | Status | Start Date |
|---|
Upload a file, then assert name, size, and type.
Drag tasks between columns. Assert final board state.
Items silently rebuild every 2.5s. Click an old reference and you'll be clicking a ghost.
Submit works. The result is written to the DOM — just not where you can see it. Inspect the DOM after submitting, then write a test that finds it.
Hint: inspect #ghost-result in the DOM after submitting.
Assert the right thing at the right time.
Counter: 0
Captured: —
Success, error, timeout — one wait strategy won't catch all three.
Unhandled dialogs block test execution entirely. If the browser offers to suppress further dialogs, do not check it — refresh the page to reset.
Assert localStorage directly — the UI can lie.
The button text always updates correctly — but occasionally aria-pressed doesn't. The UI looks fine. Assert the attribute, not the text, and your test will catch what the eye misses.
Items are added asynchronously. Fixed waits will fail — wait for the state, not the clock.
Items: 0 / 10
Live GET request to a real hosted JSON endpoint. Intercept the request to mock, modify, or simulate a failed response.
Opens a new tab. Capture the popup and assert its content like any other page.
Generate tests. Break them. Fix them. Refactor them. Review them. This is the whole course in one flow.
Please confirm your order details.
Order confirmed!
Your order ID is:
A complete booking flow with API calls to intercept, form validation, and edge cases — a full end-to-end capstone project.
Open Booking Portal →29 components with real accessibility problems built in — low contrast, missing labels, broken keyboard navigation, and more. A practice ground for learning to find and test these issues.
Open Accessibility Suite →