Practice
Hard practice
Adversarial patterns — regenerating ids, nested iframes, shadow DOM, race conditions. The stuff that actually breaks brittle test suites in production.
7 drills across every category — come back to any of them as many times as you like, there's nothing to "complete."
Async City Search
A debounced combobox fetches suggestions as you type, built with real `role="combobox"`/`aria-expanded` semantics — practice ARIA-role locators and waiting for async results.
Custom Date Range Picker
A calendar widget spanning two months — select a start and end date across a month boundary.
Flaky Retry Button
This action fails at random about 40% of the time — your automation needs real retry logic, not a lucky run.
Nested iframes
An iframe inside an iframe inside an iframe — the target button is three context switches deep.
Open Shadow Root Form
A `<custom-input>` web component renders its markup inside an open shadow root — `querySelector` on the document alone will not find it.
Regenerating IDs
Every page load, the server mints a fresh random id/class — a hardcoded locator breaks on the very next run.
Sortable, Filterable, Paginated Grid
A data grid with column sorting, a text filter, and pagination — locate a specific row after the sort order and page have changed.
Comfortable with the fundamentals?
Scenarios string several drills together into one realistic, multi-step flow — closer to what you'd actually be asked to automate.