Highlights
Locators Update
* Use [`Locator.or_`](https://playwright.dev/python/docs/api/class-locator#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:
python
new_email = page.get_by_role("button", name="New email")
dialog = page.get_by_text("Confirm security settings")
expect(new_email.or_(dialog)).is_visible()
if (dialog.is_visible())
page.get_by_role("button", name="Dismiss").click()
new_email.click()
* Use new options [`has_not`](https://playwright.dev/python/docs/api/class-locator#locator-filter-option-has-not) and [`has_not_text`](https://playwright.dev/python/docs/api/class-locator#locator-filter-option-has-not-text) in [`Locator.filter`](https://playwright.dev/python/docs/api/class-locator#locator-filter)
to find elements that **do not match** certain conditions.
python
row_locator = page.locator("tr")
row_locator
.filter(has_not_text="text in column 1")
.filter(has_not=page.get_by_role("button", name="column 2 button"))
.screenshot()
* Use new web-first assertion [`expect(locator).to_be_attached()`](https://playwright.dev/python/docs/api/class-locatorassertions#locator-assertions-to-be-attached) to ensure that the element
is present in the page's DOM. Do not confuse with the [`expect(locator).to_be_visible()`](https://playwright.dev/python/docs/api/class-locatorassertions#locator-assertions-to-be-visible) that ensures that
element is both attached & visible.
New APIs
- [`Locator.or`](https://playwright.dev/python/docs/api/class-locator#locator-or)
- New option [`has_not`](https://playwright.dev/python/docs/api/class-locator#locator-filter-option-has-not) in [`Locator.filter`](https://playwright.dev/python/docs/api/class-locator#locator-filter)
- New option [`has_not_text`](https://playwright.dev/python/docs/api/class-locator#locator-filter-option-has-not-text) in [`Locator.filter`](https://playwright.dev/python/docs/api/class-locator#locator-filter)
- [`expect(locator).to_be_attached`](https://playwright.dev/python/docs/api/class-locatorassertions#locator-assertions-to-be-attached)
- New option [`timeout`](https://playwright.dev/python/docs/api/class-route#route-fetch-option-timeout) in [`method: Route.fetch`](https://playwright.dev/python/docs/api/class-route#route-fetch)
⚠️ Breaking change
* The `mcr.microsoft.com/playwright/python:v1.33.0` now serves a Playwright image based on Ubuntu Jammy.
To use the focal-based image, please use `mcr.microsoft.com/playwright/python: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