From b771a24f2cdc1cf791b4e16786ae1e7f3db2dc0b Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 2 May 2023 11:07:33 -0700 Subject: [PATCH] docs: release notes for language ports (#22762) --- docs/src/release-notes-csharp.md | 55 ++++++++++++++++++++++++++++ docs/src/release-notes-java.md | 61 ++++++++++++++++++++++++++++++++ docs/src/release-notes-python.md | 55 ++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) diff --git a/docs/src/release-notes-csharp.md b/docs/src/release-notes-csharp.md index 4be9356d8e..b6cc03f5ef 100644 --- a/docs/src/release-notes-csharp.md +++ b/docs/src/release-notes-csharp.md @@ -4,6 +4,61 @@ title: "Release notes" toc_max_heading_level: 2 --- +## Version 1.33 + +### Locators Update + +* Use [`method: 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: + + ```csharp + var newEmail = page.GetByRole(AriaRole.Button, new() { Name = "New" }); + var dialog = page.GetByText("Confirm security settings"); + await Expect(newEmail.Or(dialog)).ToBeVisibleAsync(); + if (await dialog.IsVisibleAsync()) + await page.GetByRole(AriaRole.Button, new () { Name = "Dismiss" }).ClickAsync(); + await newEmail.ClickAsync(); + ``` +* Use new options [`option: hasNot`] and [`option: hasNotText`] in [`method: Locator.filter`] + to find elements that **do not match** certain conditions. + + ```csharp + var rowLocator = page.Locator("tr"); + await rowLocator + .Filter(new () { HasNotText = "text in column 1" }) + .Filter(new () { HasNot = page.GetByRole(AriaRole.Button, new () { Name = "column 2 button" })) + .ScreenshotAsync(); + ``` +* Use new web-first assertion [`method: LocatorAssertions.toBeAttached`] to ensure that the element + is present in the page's DOM. Do not confuse with the [`method: LocatorAssertions.toBeVisible`] that ensures that + element is both attached & visible. + +### New APIs + +- [`method: Locator.or`] +- New option [`option: hasNot`] in [`method: Locator.filter`] +- New option [`option: hasNotText`] in [`method: Locator.filter`] +- [`method: LocatorAssertions.toBeAttached`] +- New option [`option: timeout`] in [`method: Route.fetch`] + +### ⚠️ Breaking change + +* The `mcr.microsoft.com/playwright/dotnet:v1.34.0` now serves a Playwright image based on Ubuntu Jammy. + To use the focal-based image, please use `mcr.microsoft.com/playwright/dotnet:v1.34.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 + + ## Version 1.32 ### New APIs diff --git a/docs/src/release-notes-java.md b/docs/src/release-notes-java.md index 025128c5c6..beece1a629 100644 --- a/docs/src/release-notes-java.md +++ b/docs/src/release-notes-java.md @@ -4,6 +4,67 @@ title: "Release notes" toc_max_heading_level: 2 --- +## Version 1.33 + +### Locators Update + +* Use [`method: 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: + + ```java + Locator newEmail = page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("New")); + Locator dialog = page.getByText("Confirm security settings"); + assertThat(newEmail.or(dialog)).isVisible(); + if (dialog.isVisible()) + page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Dismiss")).click(); + newEmail.click(); + ``` +* Use new options [`option: hasNot`] and [`option: hasNotText`] in [`method: Locator.filter`] + to find elements that **do not match** certain conditions. + + ```java + Locator rowLocator = page.locator("tr"); + rowLocator + .filter(new Locator.FilterOptions().setHasNotText("text in column 1")) + .filter(new Locator.FilterOptions().setHasNot( + page.getByRole(AriaRole.BUTTON, + new Page.GetByRoleOptions().setName("column 2 button" )))) + .screenshot(); + ``` +* Use new web-first assertion [`method: LocatorAssertions.toBeAttached`] to ensure that the element + is present in the page's DOM. Do not confuse with the [`method: LocatorAssertions.toBeVisible`] that ensures that + element is both attached & visible. + +### New APIs + +- [`method: Locator.or`] +- New option [`option: hasNot`] in [`method: Locator.filter`] +- New option [`option: hasNotText`] in [`method: Locator.filter`] +- [`method: LocatorAssertions.toBeAttached`] +- New option [`option: timeout`] in [`method: Route.fetch`] + +### Other highlights + +- Native support for Apple Silicon - Playwright now runs without Rosetta +- Added Ubuntu 22.04 (Jammy) Docker image + +### ⚠️ Breaking change + +* The `mcr.microsoft.com/playwright/java:v1.34.0` now serves a Playwright image based on Ubuntu Jammy. + To use the focal-based image, please use `mcr.microsoft.com/playwright/java:v1.34.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 + ## Version 1.32 ### New APIs diff --git a/docs/src/release-notes-python.md b/docs/src/release-notes-python.md index 80252a2475..8f37cc272f 100644 --- a/docs/src/release-notes-python.md +++ b/docs/src/release-notes-python.md @@ -4,6 +4,61 @@ title: "Release notes" toc_max_heading_level: 2 --- +## Version 1.33 + +### Locators Update + +* Use [`method: 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 + const newEmail = page.get_by_role('button', name='New ); + const dialog = page.get_by_text('Confirm security settings'); + expect(newEmail.or_(dialog)).is_visible(); + if (dialog.is_visible()) + page.get_by_role('button', name='Dismiss').click(); + newEmail.click(); + ``` +* Use new options [`option: hasNot`] and [`option: hasNotText`] in [`method: Locator.filter`] + to find elements that **do not match** certain conditions. + + ```python + const rowLocator = page.locator('tr'); + rowLocator + .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 [`method: LocatorAssertions.toBeAttached`] to ensure that the element + is present in the page's DOM. Do not confuse with the [`method: LocatorAssertions.toBeVisible`] that ensures that + element is both attached & visible. + +### New APIs + +- [`method: Locator.or`] +- New option [`option: hasNot`] in [`method: Locator.filter`] +- New option [`option: hasNotText`] in [`method: Locator.filter`] +- [`method: LocatorAssertions.toBeAttached`] +- New option [`option: timeout`] in [`method: Route.fetch`] + +### ⚠️ Breaking change + +* The `mcr.microsoft.com/playwright/python:v1.34.0` now serves a Playwright image based on Ubuntu Jammy. + To use the focal-based image, please use `mcr.microsoft.com/playwright/python:v1.34.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 + + ## Version 1.32 ### New APIs