Multiple Element Filter
Hands-on with allInnerTexts(), locator.all() and filter({ hasText }) on a realistic login UI. Best place to start if you're new to Playwright locators.
32 hands-on pages built specifically to teach Playwright - locator strategies, tables, forms, frames,
widgets, network mocking, end-to-end projects, and the patterns you use in every real test suite.
Every interactive element ships with data-test, id and an accessible name.
Pick a track below, or scroll the full catalogue further down.
The three best entry points - one for learning locators, one for a guided project, one for everything together.
Hands-on with allInnerTexts(), locator.all() and filter({ hasText }) on a realistic login UI. Best place to start if you're new to Playwright locators.
Full TTACart-style e-commerce flow with 6 special test users, sort, cart, 2-step checkout. Write a complete Playwright suite against it.
Open TTACartStep-by-step walkthrough of a production-grade Playwright framework: TypeScript, Page Objects, fixtures, JSON/CSV data, Allure, Docker, sharded CI.
Open the tutorialClick a card below to jump to its full list further down the page.
Locators, web tables, dropdowns, comboboxes, sortable admin grids, the QA profile form, plus 10-row directories.
9 pagesIframes, multi-frame framesets, SVG, Shadow DOM, calendars, drag-drop, dialogs, hover/right-click menus, file upload + download.
14 pagesCookbooks you'll keep open while writing tests - assertions, test modifiers + hooks, data-driven + POM, JavaScript notes (14 sections), and the framework build-out.
5 referencesFull-flow apps for writing complete suites - TTACart (e-commerce), TTAStays (hotel booking), TTA AI Chat. All with rich data-test hooks.
The structured 90-day learning path that complements the hands-on practice pages below.
The full 8-module curriculum covering Playwright fundamentals, advanced locators, network interception, the test runner, page-object models, CI/CD, and debugging.
The original two — login UI and a 10-row employee directory.
Practise allInnerTexts(), locator.all(), footer link extraction, and filter({ hasText }) on a realistic login UI.
Practise XPath sibling selectors, CSS :has(), checkbox selection, and extracting row data from a realistic employee table.
Five practice pages — every page has visible locator markers and a collapsible Playwright solution.
Text inputs, radios, dropdown, date, checkboxes, tabs, upload and download — every standard input type in one page.
A minimal three-column table — Company / Contact / Country — with row-level data-testids for clean locator practice.
A six-column wide table for nth-child reads, multi-cell row extraction, and sibling-text queries.
Three custom dropdowns built without native <select>. Click-to-open, click-an-option pattern with .select-trigger markers.
Five combobox variants — single, multi, creatable, grouped, async — using familiar tta-rs__ class names.
24 employees, sortable columns with aria-sort, search/role/status filters, pagination, and a bulk-select bar.
Two-innings batting card. Pull every score with tbody td:nth-child(3), drop Extras + Total, find the highest run-getter.
An iframe form and a multi-frame frameset — practise frameLocator() and page.frames().
An iframe hosting a vehicle registration form for frameLocator(...), plus a link to the multi-frame frameset.
A classic <frameset> with three named frames (main, side, footer) for counting and iteration.
Three iframes nested three levels deep — #pact1 > #pact2 > #pact3. Practise chained frameLocator() with inputs at every depth.
Classic 8-frame nested <frameset> with names main, navbar, content, bot + 4 voids. Read frame[name='main'] h2, count via page.locator('//frame').all(), and click navbar links retargeting name='content'.
Inline SVG, web components with shadow roots, and a MakeMyTrip-style date range picker — three new locator-practice surfaces.
A shape gallery, an interactive bar chart, and a star rating control. Practise SVG selectors, getByRole with accessible names, and data-testid on SVG nodes.
Three custom elements (tta-input-card, tta-counter, tta-nested) with open shadow roots. Modern Playwright pierces shadow boundaries automatically.
A two-month range picker in the spirit of MakeMyTrip / SpiceJet. Each day is a role="button" with aria-label and data-date="YYYY-MM-DD".
4-column board with 8 draggable cards. HTML5-native DnD so locator.dragTo() works, plus a manual mouse-event recipe for stubborn libraries.
Trigger toasts in 4 flavours with configurable duration. Practise toBeVisible({ timeout }) and asserting they're gone.
Browser alert / confirm / prompt plus a custom modal that stacks. Practise page.on('dialog', ...).
Travel-style nav. Hover Add-ons to reveal Taxi/Hotel/Insurance/Meal/Wifi/Activities. Practise locator.hover() + nested hover.
Right-click target spawns ul.context-menu-list. Read items via allInnerTexts(), click any item by text. Practise click({ button: 'right' }).
Sign-up form driven entirely by page.keyboard. Practise pressSequentially, Tab order, Space to toggle, Enter to submit.
Mock APIs from your tests with page.route(). Stub success, force errors, slow things down, modify payloads.
A small product catalog backed by /api/products. The endpoint doesn't exist — install page.route() mocks to drive the UI.
Two pages that filled the old "Coming next" slot — now real, runnable, with hidden Playwright solutions.
Anchor target=_blank · window.open() · spawn 3 tabs · noopener variant. Practise context.waitForEvent('page') + Promise.all.
Single + multi-file inputs · drop-zone with hidden input · blob downloads + static link. Practise setInputFiles and waitForEvent('download').
Full-flow apps you can write a complete test suite against - register, login, checkout, payment, confirmation.
Full TTACart-style flow: login (6 special test users) → product list with sort → product detail → cart → 2-step checkout → order complete. Every interactive element has data-test, id and accessible name for Playwright. Special users trigger quirks (locked-out error, problem-user image swap, performance_glitch_user 4s delay, etc.).
Full booking flow: search by destination + dates → filter/sort 10 stays → hotel detail with 3 room types → register / login → guest details → dummy card payment → confirmation with TTA-XXXXXX reference. 200+ data-test hooks for Playwright.
The Testing Academy Bank: register → sign in → ₹50,000 balance on the dashboard → send money to 5 beneficiaries via a confirm dialog → receive money → dummy QR pay with mark-as-paid → expense tracker + filterable ledger. Locator triplets (data-testid, data-id, roles) on every control. Demo login: [email protected] / Test@1234.
A page that fights back: skeleton loaders with random latency, a spinner that lies, elements that detach and re-attach mid-render, debounced search, an optimistic toggle that rolls back, and a late-enabled submit. Beat it with web-first assertions and expect().toPass(), never waitForTimeout.
An order feed driven entirely by fetch, with visible loading, empty, error, and offline states plus a live request log. Practice page.route(): fulfill fake data, force 500s and timeouts, drop the connection, and assert every failure state.
Four levels of web components: an open shadow root, nested shadow-in-shadow with slots, a closed root you cannot pierce (and what to do instead), and the boss level, an iframe living inside a shadow root. Playwright pierces open shadow DOM natively; learn exactly where that stops.
Drag-drop zone, multi-file input with size and type validation, a hidden-input picker for filechooser practice, then generated downloads with timestamped filenames whose contents you must open and assert. setInputFiles to download-event handling, end to end.
Login with an on-screen OTP step, a session that visibly expires after 60 seconds, remember-me that skips the OTP, and an approval popup via window.open + postMessage. Drills storageState reuse, clock control, popup handling, and re-auth recovery.
10,000 rows claimed, ~15 in the DOM: a windowed employee list plus an infinite-scroll feed with a hard end state. Learn why getByText times out off-screen, why count() lies, and how to jump, scroll, and toPass() your way to any row.
A custom calendar with disabled weekends and past dates (ISO data-date hooks), a check-in/check-out range with computed nights, a meeting scheduler whose "tomorrow" breaks at midnight, and one instant rendered in three timezones. Built for page.clock.
Eight bars, zero DOM nodes per bar. Click bars by coordinate math, assert the hover tooltip, use the accessible data-table twin as the oracle, and run toHaveScreenshot() against a deterministic baseline, then randomize and watch the diff fail for the right reason.
ChatGPT-style chat UI calling an LLM via a Cloudflare Pages Function proxy (/api/chat). Students drive it with Playwright: type a prompt, click data-test="send-button", wait for data-test="message-assistant". Supports BYO API key via the settings drawer.
V2 of TTACart with the AI layer live in the browser. Five clickable demos calling the /api/chat proxy: failure RCA, self-healing locator, prompt-to-spec, smart test data, PR reviewer bot. Sticky control bar with model dropdown (8 options), temperature slider, 50k token budget chip + BYO-key drawer.
Reference pages with code patterns you'll lift into your own framework.
Cookbook covering test.skip / slow / fixme, test.step, hooks, describe.serial, data from JSON · CSV · Faker, plus a reusable UtilElementLocator helper.
14-section reference covering V8 engine, scoping, operators, control flow, loops, objects/JSON, functions, arrow / IIFE / callbacks, plus 140+ assignment prompts. Hand-drawn diagrams for the tricky bits.
11 patterns: Faker single / util / loop / domains, inline array, JSON, CSV, XLSX, hooks, POM + DDT, and 5 page-object classes wired through UtilElementLocator. Sample register.csv / register.json downloads + client-side XLSX generator.
Step-by-step walkthrough of the TTA Advance Playwright Framework - TypeScript, Page Object Model, custom fixtures, JSON/CSV test data, environment-aware config, a custom HTML reporter, Dockerfile, and a sharded 4-way GitHub Actions workflow with merge-reports. Every snippet copy-pasteable and targets TTA practice pages.
V2 of the framework tutorial. Adds an 11th box for the AI layer, five deep cards (one per AI feature) with per-feature mermaid diagrams, a multi-model adapter for 7 providers (DeepSeek default + Anthropic / OpenAI / Gemini / Mistral / Ollama / LM Studio) and a privacy + cost guards section. Pairs with the live demo at /playwright/ttacart-ai/.
Stack versus heap, what the garbage collector can and cannot free, the four classic leak sources, Map versus WeakMap, and where a Playwright suite actually leaks. Every claim executed in Node before publishing.
The complete regular-expressions tutorial: character classes, quantifiers, anchors, flags, groups, lookarounds, every String method that takes a regex, and every place Playwright accepts one (getByText, toHaveURL, filter, route, --grep). Ends with 10 drills and a cheat sheet.
Local review paths: /playwright/index.html, /playwright/multiple_element_filter.html, /playwright/webtable.html, /playwright/tables/*.html, /playwright/frames/*.html, /playwright/widgets/*.html, /playwright/network/*.html.
Nothing in this batch is committed or deployed until you ask for the upload.