playwright-core
1.64.1 · 14 Oct 2026Apache-2.067.8M / weekRepositoryHomepagenpmAtom feed
Latest releases
All 174 releases1.64.1
14 Oct 2026[Bug]: _electron.launch intermittently loses a packaged app's first window since 1.64.0
[Regression]: Chromium 155+ aborts a preflighted cross-origin redirect whenever any route is registered (net::ERR_ABORTED)
1.64.0
7 Oct 2026- breaking
screenproperty is now forwarded from the device descriptors. If you use...devices['Desktop Chrome']and alike,window.screenand media queries now see the emulated screen size. You can opt-out by explicitly settingscreentoundefined:// playwright.config.ts export default defineConfig({ use: { ...devices['Desktop Chrome'], screen: undefined, }, }); - breaking
JSX in your test files now follows your
tsconfig.json. Playwright compiles JSX in test files according to thejsx,jsxFactory,jsxFragmentFactoryandjsxImportSourcetsconfig options, and defaults to the automatic runtime fromreact/jsx-runtime. - breaking
--update-snapshots=missingnow passes the test run. Tests that only create missing snapshots now pass in the'missing'mode of testConfig.updateSnapshots, so that CI can generate new snapshots and verify the existing ones in a single run. The mode used when the option is not specified is now called'default'and behaves as before: missing snapshots are written and the test fails.
WebMCP
New page.webmcp and frame.webmcp give access to the tools that a page registers through the experimental WebMCP browser API, so you can test them like any other part of your app:
const browser = await chromium.launch({ args: ['--enable-features=WebMCP'] }); const page = await browser.newPage(); await page.goto('https://example.com'); for (const tool of await page.webmcp.tools()) console.log(tool.name, tool.description); const result = await page.webmcp.callTool('add', { a: 2, b: 40 }); console.log(result.content[0].text); // "42"Playwright MCP also supports WebMCP by default, with page-defined tools offered to the agent as
webmcp_<tool>. Pass--no-webmcpto opt out.playwright-cliexposes them as well:playwright-cli webmcp-list playwright-cli webmcp-call search_catalog --params '{"query":"cats"}'Better videos
Videos can now be recorded at a custom frame rate, and the decorations for actions are styled with plain CSS:
// playwright.config.ts import { defineConfig } from '@playwright/test'; export default defineConfig({ use: { video: { mode: 'on', size: { width: 1920, height: 1080 }, fps: 60, show: { actions: { style: { point: 'width: 20px; height: 20px; border-radius: 50%; background: red', highlight: 'outline: 2px solid #333; background: rgba(0, 128, 255, .15)', title: 'font-size: 16px', }, }, }, }, }, });New
fpsoption in testOptions.video,recordVideoand
screencast.start(). Firefox and WebKit currently capture up to 25 frames per second.New
styleoption takes CSS declarations for thepointmarker, the targethighlightand the actiontitle. It replaces thefontSizeoption, which is now deprecated.The cursor stays visible at the last action point, survives navigations and travels along a natural, eased path.
Videos are encoded with VP9 instead of VP8, which takes less CPU and produces smaller files of the same or better
quality.All video options are also available in Playwright MCP and
playwright-cli.
Test runner
New testProject.default option keeps a project in the config without running it by default. You can configure every browser you care about, and let a plain
npx playwright testrun just your favourite one:// playwright.config.ts import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ projects: [ { name: 'chromium', use: devices['Desktop Chrome'] }, { name: 'firefox', use: devices['Desktop Firefox'], default: false }, { name: 'webkit', use: devices['Desktop Safari'], default: false }, ], });npx playwright test # runs chromium only npx playwright test --project=firefox # runs firefox npx playwright test --project="*" # runs all three, for example on CI
New
--shufflecommand line option schedules tests in a random order, which helps to find tests that accidentally depend on each other.npx playwright test --shuffle # Running 42 tests using 4 workers, shuffle seed 271828182 # ... # Pass the seed to reproduce the same order. npx playwright test --shuffle 271828182
New
lockoption in test.describe.configure() adds test locks to all tests in a file or a group:test.describe.configure({ lock: 'user-settings' });New
typeoption oftoHaveScreenshotin testConfig.expect stores all unnamed screenshots as WebP:// playwright.config.ts export default defineConfig({ expect: { toHaveScreenshot: { type: 'webp' }, }, });
Locator.within()
New locator.within() combines two locators that you already have, reading in the natural order
"this button, within that dialog":const saveButton = page.getByRole('button', { name: 'Save' }); const dialog = page.getByTestId('settings-dialog'); await saveButton.within(dialog).click();Relative locators such as locator.nth() or locator.first() are resolved inside each parent
separately, which makes column-like queries straightforward:// The third cell of every row, not the third cell in the table. const thirdColumn = page.getByRole('cell').nth(2).within(page.getByRole('row')); await expect(thirdColumn).toHaveText(['Apple', 'Banana', 'Cherry']);New APIs
New page.getByRef() locates an element by its aria ref, such as
e2, reported by page.ariaSnapshot() in the'ai'mode.New option
includeShadowin page.content() and frame.content() serializes open shadow roots as declarative shadow DOM.New option
signCountsets the initial signature counter of a virtual credential. credentials.create() and credentials.get() return the currentsignCount, and it is saved and restored together with the credentials in the storage state.New fullConfig.filteredProjects lists the projects that were selected to run after applying the
--projectfilter. It is available in global setup and reporters.New apiRequestContext.addCookies(), apiRequestContext.cookies() and apiRequestContext.clearCookies() manage cookies of a request context, mirroring the BrowserContext methods:
await request.addCookies([{ name: 'session-id', value: '42', url: 'https://example.com' }]); console.log(await request.cookies('https://example.com')); await request.clearCookies({ name: 'session-id' });
Breaking changes
- breaking
screenproperty is now forwarded from the device descriptors. If you use...devices['Desktop Chrome']and alike,window.screenand media queries now see the emulated screen size. You can opt-out by explicitly settingscreentoundefined:// playwright.config.ts export default defineConfig({ use: { ...devices['Desktop Chrome'], screen: undefined, }, }); - breaking
JSX in your test files now follows your
tsconfig.json. Playwright compiles JSX in test files according to thejsx,jsxFactory,jsxFragmentFactoryandjsxImportSourcetsconfig options, and defaults to the automatic runtime fromreact/jsx-runtime. - breaking
--update-snapshots=missingnow passes the test run. Tests that only create missing snapshots now pass in the'missing'mode of testConfig.updateSnapshots, so that CI can generate new snapshots and verify the existing ones in a single run. The mode used when the option is not specified is now called'default'and behaves as before: missing snapshots are written and the test fails. - breaking
Elements inside hidden iframes are considered hidden. Elements inside an iframe that is not visible, for example with
visibility: hidden, are now considered hidden by actions, locator.isVisible() and expect(locator).toBeVisible().
Browser Versions
Chromium 156.0.8078.4
Mozilla Firefox 157.0
WebKit 27.2
This version was also tested against the following stable channels:
Google Chrome 155
Microsoft Edge 155
1.63.0
4 Sep 2026- breaking
⚠️ The experimental
@playwright/experimental-ct-react,@playwright/experimental-ct-react17and@playwright/experimental-ct-vuepackages will no longer be updated. Follow the migration guide to move to the stories model introduced in 1.62. Story ids passed to fixtures.mount() can now be typed through the generatedStoriesregistry. - breaking
⚠️ Ubuntu 20.04 is not supported anymore.
httpCredentialsnow also accepts an array of credentials. The first entry matching the request origin is used, and entries without an origin match any request.
Test locks
Tests that access a shared resource — an external service, a global account setting — can now declare a named
lock.
Tests that share a lock name never run concurrently, across files, workers and projects, while
everything else keeps running in parallel:test('update user settings', { lock: 'user-settings' }, async ({ page }) => { // never runs at the same time as other tests holding 'user-settings' });A test can hold multiple locks, and test.describe() accepts a
lockfor the whole group.
Learn more about test locks.Locate across frames
page.frameLocator() and frame.frameLocator() called without a selector search in any frame of the
subtree, so you no longer need to locate the iframe first:// Finds the button in any frame on the page. await page.frameLocator().getByRole('button').click();The rest of the locator resolves inside a single frame, just like a regular locator, and an error is thrown when it
matches elements in several frames.Visible-only locators
New locator.visible() returns a locator that matches only visible elements. It is the recommended
replacement for the:visibleCSS pseudo-class:await page.locator('button').visible().click();Step params and subtitles
Steps now carry structured data for reporters. Playwright API steps report the target locator and call arguments,
and test.step() acceptssubtitleandparamsoptions for your own steps:await test.step('Login', async () => { // ... }, { subtitle: 'as admin', params: { user: 'admin' } });Reporters receive them via testStep.subtitle and testStep.params. For Playwright API
steps, the subtitle is the locator or the navigation url — for example,Clickwith subtitlegetByRole('button').
Both are rendered next to the step title in the trace viewer and the HTML report.Aria and screen snapshots in traces
The
snapshotsoption of tracing.start() and the testOptions.trace fixture option now accept an
object selecting what to capture on every action:// playwright.config.ts export default defineConfig({ use: { trace: { mode: 'on', snapshots: { dom: true, aria: true, screen: true } }, }, });With aria and screen snapshots recorded, the new Display Aria mode in the trace viewer shows the action screenshot
side by side with the aria snapshot, and hovering an aria node highlights it on the screenshot.New APIs
Browser and Context
httpCredentialsnow also accepts an array of credentials. The first entry matching the request origin is used, and entries without an origin match any request.New option
opfsincludes the origin private file system in the storage state, so it can be persisted and restored into later contexts.New events page.on('dialogclosed') and browserContext.on('dialogclosed') are emitted when a JavaScript dialog is accepted, dismissed or closed by the user.
Locators
New locator.ariaSnapshotJSON() and page.ariaSnapshotJSON() return the aria snapshot as a JSON value instead of YAML markup, with
mode,depthandboxesoptions.apiRequestContext.get() and other request methods accept a type argument that types the response
json():
const response = await request.get<User>('/api/users/42'); const user = await response.json(); // typed as UserTest runner
New standalone testOptions.reducedMotion, testOptions.forcedColors and testOptions.contrast options.
New
--add-reportercommand line option appends a reporter on top of the ones configured inplaywright.config, instead of replacing them like--reporterdoes.New
omitTagsoption for thelist,line,dot,githubandjunitreporters suppresses the tags that are automatically appended to test titles.
Command line
npx playwright install --no-removekeeps the browsers of other Playwright installations instead of removing them.npx playwright codegen --http-credentialsrecords against pages behind HTTP authentication.
Miscellaneous
New built-in
perfettoreporter writes a Trace Event Format file for the Perfetto UI orchrome://tracing, rendering the test run as a timeline with a lane per worker.The HTML report renders a duration waterfall next to test steps.
Announcements
- breaking
⚠️ The experimental
@playwright/experimental-ct-react,@playwright/experimental-ct-react17and@playwright/experimental-ct-vuepackages will no longer be updated. Follow the migration guide to move to the stories model introduced in 1.62. Story ids passed to fixtures.mount() can now be typed through the generatedStoriesregistry. - breaking
⚠️ Ubuntu 20.04 is not supported anymore.
🐧 On Linux arm64, Playwright now downloads the Chrome for Testing build of Chromium, the same build used on all other platforms.
Browser Versions
Chromium 153.0.8010.12
Mozilla Firefox 155.0
WebKit 26.6
This version was also tested against the following stable channels:
Google Chrome 153
Microsoft Edge 153
1.62.1
30 Jul 2026[Regression]: tsconfig "extends" bare specifier isn't resolved via node_modules walk-up like tsc (fatal since 1.62)
[Regression]: directory-form tsconfig project references ("path": "../pkg") fail to resolve (fatal since 1.62)
Accessibility snapshot drops button name when text is nested inside spans with aria-hidden SVG
Bug Fixes
[Regression]: tsconfig "extends" bare specifier isn't resolved via node_modules walk-up like tsc (fatal since 1.62)
[Regression]: directory-form tsconfig project references ("path": "../pkg") fail to resolve (fatal since 1.62)
Accessibility snapshot drops button name when text is nested inside spans with aria-hidden SVG
[Regression]: page.evaluate() arg of a branded primitive type (string & { brand }) no longer type-checks since 1.62
[BUG]Image-type actionable elements are not presented in the snapshot.
1.62.0
24 Jul 2026
Notes older than 90 days are read on the Releases tab.
Dependency tracking · free for 3 projects
Know when your own dependencies move
playwright-core published 14 releases in the last 12 months. Inlinr folds the routine ones into a line and keeps the few that need you.
Advisories reach you
An email when a critical or high advisory affects a project, before the next install.
Upgrades checked first
Peer ranges, Node, ESM-only and types changes read before you bump.
Only what matters
Majors and breaking notes stay; patches and sibling bumps fold into one line.
Registry facts last checked 26 Oct 2026. Releases and advisories last read 26 Oct 2026.