Skip to content


Choose a tag to compare
@aslushnikov aslushnikov released this 27 Apr 01:36
· 4 commits to release-1.33 since this release

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();
  • Use new options hasNot and hasNotText in locator.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' }) })
  • 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

⚠️ Breaking change

  • The now serves a Playwright image based on Ubuntu Jammy.
    To use the focal-based image, please use 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