Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.
APACHE-2.0 License
Bot releases are visible (Hide)
Published by dgozman about 1 year ago
You can extend Playwright assertions by providing custom matchers. These matchers will be available on the expect object.
import { expect as baseExpect } from '@playwright/test';
export const expect = baseExpect.extend({
async toHaveAmount(locator: Locator, expected: number, options?: { timeout?: number }) {
// ... see documentation for how to write matchers.
},
});
test('pass', async ({ page }) => {
await expect(page.getByTestId('cart')).toHaveAmount(5);
});
See the documentation for a full example.
You can now merge test fixtures from multiple files or modules:
import { mergeTests } from '@playwright/test';
import { test as dbTest } from 'database-test-utils';
import { test as a11yTest } from 'a11y-test-utils';
export const test = mergeTests(dbTest, a11yTest);
import { test } from './fixtures';
test('passes', async ({ database, page, a11y }) => {
// use database and a11y fixtures.
});
You can now merge custom expect matchers from multiple files or modules:
import { mergeTests, mergeExpects } from '@playwright/test';
import { test as dbTest, expect as dbExpect } from 'database-test-utils';
import { test as a11yTest, expect as a11yExpect } from 'a11y-test-utils';
export const test = mergeTests(dbTest, a11yTest);
export const expect = mergeExpects(dbExpect, a11yExpect);
import { test, expect } from './fixtures';
test('passes', async ({ page, database }) => {
await expect(database).toHaveDatabaseUser('admin');
await expect(page).toPassA11yAudit();
});
You can mark a test.step()
as "boxed" so that errors inside it point to the step call site.
async function login(page) {
await test.step('login', async () => {
// ...
}, { box: true }); // Note the "box" option here.
}
Error: Timed out 5000ms waiting for expect(locator).toBeVisible()
... error details omitted ...
14 | await page.goto('https://github.com/login');
> 15 | await login(page);
| ^
16 | });
See test.step()
documentation for a full example.
This version was also tested against the following stable channels:
Published by aslushnikov about 1 year ago
https://github.com/microsoft/playwright/issues/27071 - expect(value).toMatchSnapshot() deprecation announcement on V1.38
https://github.com/microsoft/playwright/issues/27072 - [BUG] PWT trace viewer fails to load trace and throws TypeError
https://github.com/microsoft/playwright/issues/27073 - [BUG] RangeError: Invalid time value
https://github.com/microsoft/playwright/issues/27087 - [REGRESSION]: npx playwright test --list prints all tests twice
https://github.com/microsoft/playwright/issues/27113 - [REGRESSION]: No longer able to extend PlaywrightTest.Matchers type for locators and pages
https://github.com/microsoft/playwright/issues/27144 - [BUG]can not display trace
https://github.com/microsoft/playwright/issues/27163 - [REGRESSION] Single Quote Wrongly Escaped by Locator When Using Unicode Flag
https://github.com/microsoft/playwright/issues/27181 - [BUG] evaluate serializing fails at 1.38
This version was also tested against the following stable channels:
Published by aslushnikov about 1 year ago
browserContext.on('weberror')
locator.pressSequentially()
reporter.onEnd()
now reports startTime
and total run duration
.page.type()
, frame.type()
, locator.type()
and elementHandle.type()
.locator.fill()
instead which is much faster. Use locator.pressSequentially()
only if there is a[!NOTE]
If you are using@playwright/test
package, this change does not affect you.
Playwright recommends to use @playwright/test
package and download browsers via npx playwright install
command. If you are following this recommendation, nothing has changed for you.
However, up to v1.38, installing the playwright
package instead of @playwright/test
did automatically download browsers. This is no longer the case, and we recommend to explicitly download browsers via npx playwright install
command.
v1.37 and earlier
playwright
package was downloading browsers during npm install
, while @playwright/test
was not.
v1.38 and later
playwright
and @playwright/test
packages do not download browsers during npm install
.
Recommended migration
Run npx playwright install
to download browsers after npm install
. For example, in your CI configuration:
- run: npm ci
- run: npx playwright install --with-deps
Alternative migration option - not recommended
Add @playwright/browser-chromium
, @playwright/browser-firefox
and @playwright/browser-webkit
as a dependency. These packages download respective browsers during npm install
. Make sure you keep the version of all playwright packages in sync:
// package.json
{
"devDependencies": {
"playwright": "1.38.0",
"@playwright/browser-chromium": "1.38.0",
"@playwright/browser-firefox": "1.38.0",
"@playwright/browser-webkit": "1.38.0"
}
}
This version was also tested against the following stable channels:
Published by mxschmitt about 1 year ago
https://github.com/microsoft/playwright/issues/26496 - [REGRESSION] webServer stdout is always getting printed
https://github.com/microsoft/playwright/issues/26492 - [REGRESSION] test.only with project dependency is not working
This version was also tested against the following stable channels:
Published by aslushnikov about 1 year ago
Watch the overview: Playwright 1.36 & 1.37
If you run tests on multiple shards, you can now merge all reports in a single HTML report (or any other report)
using the new merge-reports
CLI tool.
Using merge-reports
tool requires the following steps:
Adding a new "blob" reporter to the config when running on CI:
export default defineConfig({
testDir: './tests',
reporter: process.env.CI ? 'blob' : 'html',
});
The "blob" reporter will produce ".zip" files that contain all the information
about the test run.
Copying all "blob" reports in a single shared location and running npx playwright merge-reports
:
npx playwright merge-reports --reporter html ./all-blob-reports
Read more in our documentation.
Playwright now supports Debian 12 Bookworm on both x86_64 and arm64 for Chromium, Firefox and WebKit.
Let us know if you encounter any issues!
Linux support looks like this:
Ubuntu 20.04 | Ubuntu 22.04 | Debian 11 | Debian 12 | |
---|---|---|---|---|
Chromium | ✅ | ✅ | ✅ | ✅ |
WebKit | ✅ | ✅ | ✅ | ✅ |
Firefox | ✅ | ✅ | ✅ | ✅ |
This version was also tested against the following stable channels:
Published by aslushnikov about 1 year ago
https://github.com/microsoft/playwright/issues/24316 - [REGRESSION] Character classes are not working in globs in 1.36
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
https://github.com/microsoft/playwright/issues/24184 - [REGRESSION]: Snapshot name contains some random string after test name when tests are run in container
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
Watch the overview: Playwright 1.36 & 1.37
🏝️ Summer maintenance release.
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
https://github.com/microsoft/playwright/issues/23622 - [Docs] Provide a description how to correctly use expect.configure with poll parameter
https://github.com/microsoft/playwright/issues/23666 - [BUG] Live Trace does not work with Codespaces
https://github.com/microsoft/playwright/issues/23693 - [BUG] attachment steps are not hidden inside expect.toHaveScreenshot()
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
Playwright v1.35 updates
UI mode is now available in VSCode Playwright extension via a new "Show trace viewer" button:
UI mode and trace viewer mark network requests handled with page.route()
and browserContext.route()
handlers, as well as those issued via the API testing:
New option maskColor
for methods page.screenshot()
, locator.screenshot()
, expect(page).toHaveScreenshot()
and expect(locator).toHaveScreenshot()
to change default masking color:
await page.goto('https://playwright.dev');
await expect(page).toHaveScreenshot({
mask: [page.locator('img')],
maskColor: '#00FF00', // green
});
New uninstall
CLI command to uninstall browser binaries:
$ npx playwright uninstall # remove browsers installed by this installation
$ npx playwright uninstall --all # remove all ever-install Playwright browsers
Both UI mode and trace viewer now could be opened in a browser tab:
$ npx playwright test --ui-port 0 # open UI mode in a tab on a random port
$ npx playwright show-trace --port 0 # open trace viewer in tab on a random port
playwright-core
binary got renamed from playwright
to playwright-core
. So if you use playwright-core
CLI, make sure to update the name:
$ npx playwright-core install # the new way to install browsers when using playwright-core
This change does not affect @playwright/test
and playwright
package users.
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
https://github.com/microsoft/playwright/issues/23228 - [BUG] Getting "Please install @playwright/test package..." after upgrading from 1.34.0 to 1.34.1
This version was also tested against the following stable channels:
Published by dgozman over 1 year ago
https://github.com/microsoft/playwright/issues/23225 - [BUG] VSCode Extension broken with Playwright 1.34.1
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
https://github.com/microsoft/playwright/issues/23186 - [BUG] Container image for v1.34.0 missing library for webkit
https://github.com/microsoft/playwright/issues/23206 - [BUG] Unable to install supported browsers for v1.34.0 from playwright-core
https://github.com/microsoft/playwright/issues/23207 - [BUG] importing ES Module JSX component is broken since 1.34
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
Playwright v1.33 & v1.34 updates
UI Mode now shows steps, fixtures and attachments:
New property testProject.teardown
to specify a project that needs to run after this
and all dependent projects have finished. Teardown is useful to cleanup any resources acquired by this project.
A common pattern would be a setup
dependency with a corresponding teardown
:
// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'setup',
testMatch: /global.setup\.ts/,
teardown: 'teardown',
},
{
name: 'teardown',
testMatch: /global.teardown\.ts/,
},
{
name: 'chromium',
use: devices['Desktop Chrome'],
dependencies: ['setup'],
},
{
name: 'firefox',
use: devices['Desktop Firefox'],
dependencies: ['setup'],
},
{
name: 'webkit',
use: devices['Desktop Safari'],
dependencies: ['setup'],
},
],
});
New method expect.configure
to create pre-configured expect instance with its own defaults such as timeout
and soft
.
const slowExpect = expect.configure({ timeout: 10000 });
await slowExpect(locator).toHaveText('Submit');
// Always do soft assertions.
const softExpect = expect.configure({ soft: true });
New options stderr
and stdout
in testConfig.webServer
to configure output handling:
// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
// Run your local dev server before starting the tests
webServer: {
command: 'npm run start',
url: 'http://127.0.0.1:3000',
reuseExistingServer: !process.env.CI,
stdout: 'pipe',
stderr: 'pipe',
},
});
New locator.and()
to create a locator that matches both locators.
const button = page.getByRole('button').and(page.getByTitle('Subscribe'));
New events browserContext.on('console')
and browserContext.on('dialog')
to subscribe to any dialogs
and console messages from any page from the given browser context. Use the new methods consoleMessage.page()
and dialog.page()
to pin-point event source.
npx playwright test
no longer works if you install both playwright
and @playwright/test
. There's no need
to install both, since you can always import browser automation APIs from @playwright/test
directly:
// automation.ts
import { chromium, firefox, webkit } from '@playwright/test';
/* ... */
Node.js 14 is no longer supported since it reached its end-of-life on April 30, 2023.
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
Playwright v1.33 & v1.34 updates
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();
await newEmail.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' }) })
.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.
locator.or()
hasNot
in locator.filter()
hasNotText
in locator.filter()
locatorAssertions.toBeAttached()
timeout
in route.fetch()
reporter.onExit()
mcr.microsoft.com/playwright:v1.33.0
now serves a Playwright image based on Ubuntu Jammy.mcr.microsoft.com/playwright:v1.33.0-focal
instead.This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
https://github.com/microsoft/playwright/issues/22144 - [BUG] WebServer only starting after timeout
https://github.com/microsoft/playwright/pull/22191 - chore: allow reusing browser between the tests
https://github.com/microsoft/playwright/issues/22215 - [BUG] Tests failing in toPass often marked as passed
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
https://github.com/microsoft/playwright/issues/21993 - [BUG] Browser crash when using Playwright VSC extension and trace-viewer enabled in config
https://github.com/microsoft/playwright/issues/22003 - [Feature] Make Vue component mount props less restrictive
https://github.com/microsoft/playwright/issues/22089 - [REGRESSION]: Tests failing with "Error: tracing.stopChunk"
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
https://github.com/microsoft/playwright/issues/21832 - [BUG] Trace is not opening on specific broken locator
https://github.com/microsoft/playwright/issues/21897 - [BUG] --ui fails to open with error reading mainFrame from an undefined this._page
https://github.com/microsoft/playwright/issues/21918 - [BUG]: UI mode, skipped tests not being found
https://github.com/microsoft/playwright/issues/21941 - [BUG] UI mode does not show webServer startup errors
https://github.com/microsoft/playwright/issues/21953 - [BUG] Parameterized tests are not displayed in the UI mode
This version was also tested against the following stable channels:
Published by aslushnikov over 1 year ago
Playwright v1.32 updates
New UI Mode lets you explore, run and debug tests. Comes with a built-in watch mode.
Engage with a new flag --ui
:
npx playwright test --ui
option: updateMode
and option: updateContent
in page.routeFromHAR()
and browserContext.routeFromHAR()
.TestInfo.testId
.name
in method Tracing.startChunk()
.Note: component tests only, does not affect end-to-end tests.
@playwright/experimental-ct-react
now supports React 18 only.@playwright/experimental-ct-react
with @playwright/experimental-ct-react17
.This version was also tested against the following stable channels:
Published by yury-s over 1 year ago
https://github.com/microsoft/playwright/issues/20784 - [BUG] ECONNREFUSED on GitHub Actions with Node 18
https://github.com/microsoft/playwright/issues/21145 - [REGRESSION]: firefox-1378 times out on await page.reload() when URL contains a #hash
https://github.com/microsoft/playwright/issues/21226 - [BUG] Playwright seems to get stuck when using shard option and last test is skipped
https://github.com/microsoft/playwright/issues/21227 - Using the webServer config with a Vite dev server?
https://github.com/microsoft/playwright/issues/21312 - throw if defineConfig is not used for component testing
This version was also tested against the following stable channels: