Locators Update
-
Use
locator.or()
to create a locator that matches either of the two locators.
Consider a scenario where you'd like to click on a "New email" button, but sometimes a security settings dialog shows up instead.
In this case, you can wait for either a "New email" button, or a dialog and act accordingly:const newEmail = page.getByRole('button', { name: 'New' }); const dialog = page.getByText('Confirm security settings'); await expect(newEmail.or(dialog)).toBeVisible(); if (await dialog.isVisible()) await page.getByRole('button', { name: 'Dismiss' }).click(); await newEmail.click();
-
Use new options
hasNot
andhasNotText
inlocator.filter()
to find elements that do not match certain conditions.const rowLocator = page.locator('tr'); await rowLocator .filter({ hasNotText: 'text in column 1' }) .filter({ hasNot: page.getByRole('button', { name: 'column 2 button' }) }) .screenshot();
-
Use new web-first assertion
locatorAssertions.toBeAttached()
to ensure that the element
is present in the page's DOM. Do not confuse with thelocatorAssertions.toBeVisible()
that ensures that
element is both attached & visible.
New APIs
locator.or()
- New option
hasNot
inlocator.filter()
- New option
hasNotText
inlocator.filter()
locatorAssertions.toBeAttached()
- New option
timeout
inroute.fetch()
reporter.onExit()
⚠️ Breaking change
- The
mcr.microsoft.com/playwright:v1.33.0
now serves a Playwright image based on Ubuntu Jammy.
To use the focal-based image, please usemcr.microsoft.com/playwright:v1.33.0-focal
instead.
Browser Versions
- Chromium 113.0.5672.53
- Mozilla Firefox 112.0
- WebKit 16.4
This version was also tested against the following stable channels:
- Google Chrome 112
- Microsoft Edge 112