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