Pw
TypeScript ยท @playwright/test
Element handling with Playwright
15 copy-ready Playwright recipes, each linked to a live challenge page to run them against.
Conventions
// Every snippet runs inside: test('...', async ({ page }) => { await page.goto('/<challenge>'); ... })1Type into inputs & read output
Practise on /elements/text-box โawait page.getByTestId('full-name-input').fill('Ada Lovelace');
await page.getByTestId('submit-text-box').click();
await expect(page.getByTestId('output-name')).toHaveText('Name: Ada Lovelace');2Checkboxes & select-all
Practise on /elements/check-box โawait page.getByTestId('checkbox-select-all').check();
await expect(page.getByTestId('checkbox-documents')).toBeChecked();3Native <select> dropdown
Practise on /widgets/selects-autocomplete โawait page.getByTestId('native-select').selectOption('Mumbai');
await expect(page.getByTestId('native-select-result')).toHaveText('Selected: Mumbai');4Autocomplete suggestions
Practise on /widgets/selects-autocomplete โawait page.getByTestId('autocomplete-input').fill('Ben');
await page.getByTestId('autocomplete-option-bengaluru').click();
await expect(page.getByTestId('autocomplete-result')).toHaveText('Picked: Bengaluru');5Find a table row by its text
Practise on /elements/web-tables โconst row = page.getByTestId('table-row').filter({ hasText: 'Priya' });
await row.locator('[data-testid^="delete-row-"]').click();
await expect(page.getByTestId('table-row')).toHaveCount(2);6Double-click & right-click
Practise on /elements/buttons โawait page.getByTestId('double-click-me').dblclick();
await page.getByTestId('right-click-me').click({ button: 'right' });
await expect(page.getByTestId('right-click-result')).toBeVisible();7JS alert, confirm & prompt
Practise on /alerts โpage.once('dialog', (d) => d.accept('Ada')); // register BEFORE the click
await page.getByTestId('prompt-button').click();
await expect(page.getByTestId('prompt-result')).toHaveText('You entered Ada');
page.once('dialog', (d) => d.dismiss());
await page.getByTestId('confirm-button').click();
await expect(page.getByTestId('confirm-result')).toHaveText('You selected Cancel');8Iframes & nested iframes
Practise on /frames โconst frame = page.frameLocator('[data-testid="single-frame"]');
await frame.getByTestId('single-frame-button').click();
await expect(frame.getByTestId('single-frame-result')).toHaveText('Clicked inside iframe');
const inner = page.frameLocator('[data-testid="outer-frame"]')
.frameLocator('[data-testid="innermost-frame"]');
await expect(inner.getByTestId('innermost-text')).toBeVisible();9New tabs & windows
Practise on /windows โconst [tab] = await Promise.all([
page.context().waitForEvent('page'),
page.getByTestId('new-tab-button').click(),
]);
await expect(tab.getByTestId('new-tab-heading')).toBeVisible();10HTML5 drag & drop
Practise on /interactions/droppable โawait page.getByTestId('draggable-box').dragTo(page.getByTestId('accept-zone'));
await expect(page.getByTestId('accept-zone')).toContainText('Accept (1)');11File upload
Practise on /elements/upload-download โawait page.getByTestId('file-input').setInputFiles('fixtures/sample.txt');
await expect(page.getByTestId('uploaded-file-info')).toContainText('sample.txt');12Hover tooltips
Practise on /widgets/tooltips-menus โawait page.getByTestId('tooltip-trigger').hover();
await expect(page.getByTestId('tooltip')).toBeVisible();13Wait for dynamically loaded content
Practise on /dynamic/dynamic-loading โawait page.getByTestId('loading-1-start').click();
// Auto-waits up to the expect timeout (5s by default).
await expect(page.getByTestId('loading-1-result')).toContainText('Hello World!');14Shadow DOM
Practise on /shadow-dom โ// CSS locators pierce open shadow roots automatically.
await page.locator('shadow-counter #inc').click();
await expect(page.locator('shadow-counter #count')).toHaveText('Count: 1');15Keyboard keys
Practise on /interactions/key-presses โawait page.getByTestId('key-input').press('Enter');
await expect(page.getByTestId('key-result')).toHaveText('You entered: Enter');