v1.33.0
microsoft/playwrightv1.33.0Apr 27, 2023by aslushnikov
AI Summary
A feature release focused on advanced locator capabilities and web-first assertions.
Key Highlights
- New `locator.or()` method to match either of two locators
- New `hasNot` and `hasNotText` options in `locator.filter()`
- New `locatorAssertions.toBeAttached()` assertion
- New `timeout` option in `route.fetch()`
- New `reporter.onExit()` hook
Breaking Changes
- Docker image changed from Ubuntu Focal to Jammy (use `-focal` tag for Focal)
New Features
- Locator disjunction with `locator.or()`
- Negative filtering with `hasNot` and `hasNotText` in locators
- Web-first element attachment assertions
- Route fetch timeout configuration
- Reporter exit lifecycle hook
Full Release Notes
<a href="https://youtu.be/JeFD6rqDbBo"><img src="https://github.com/microsoft/playwright/assets/746130/4e165491-1b1b-41c6-8674-4295622b66df" width=340></a>
<a href="https://youtu.be/JeFD6rqDbBo">Playwright v1.33 & v1.34 updates</a>
### 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:
```js
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` and `hasNotText` in [`locator.filter()`]
to find elements that **do not match** certain conditions.
```js
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 the [`locatorAssertions.toBeVisible()`] that ensures that
element is both attached & visible.
### New APIs
- [`locator.or()`]
- New option `hasNot` in [`locator.filter()`]
- New option `hasNotText` in [`locator.filter()`]
- [`locatorAssertions.toBeAttached()`]
- New option `timeout` in [`route.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 use `mcr.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
[`locator.or()`]: https://playwright.dev/docs/api/class-locator#locator-or
[`reporter.onExit()`]: https://playwright.dev/docs/api/class-reporter#reporter-on-exit
[`locator.filter()`]: https://playwright.dev/docs/api/class-locator#locator-filter
[`locatorAssertions.toBeAttached()`]: https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-be-attached
[`locatorAssertions.toBeVisible()`]: https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-be-visible
[`route.fetch()`]: https://playwright.dev/docs/api/class-route#route-fetch