Releases of playwright
191 stable releases, newest first. Release notes are kept for the last 90 days; older ones link to where they were published.
1.64.1
14 October 2026Bug Fixes
[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 October 2026WebMCP
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.1.63.0
4 September 2026Test 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.1.62.1
30 July 2026Bug 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
1.62.0
24 July 2026New component testing model
Component testing moves to a stories and galleries model. A story wraps your component in one specific scenario — hard-coded props, mock data, providers — and a gallery page that you serve renders stories on demand. The new fixtures.mount() fixture navigates to the gallery, mounts a story by id, and returns a Locator scoped to the story's root element:
test('click should expand', async ({ mount }) => { const component = await mount('components/Expandable/Stateful'); await component.getByRole('button').click(); await expect(component.getByTestId('expanded')).toHaveValue('true'); });Pass a story type as a template argument to type-check its props, and use
update(props)/unmount()on the returned locator to re-render or tear down within a test.1.61.1
23 June 20261.61.0
15 June 20261.60.0
11 May 20261.59.1
1 April 20261.59.0
1 April 20261.58.2
6 February 20261.58.1
30 January 20261.58.0
23 January 20261.57.0
25 November 20251.56.1
17 October 20251.56.0
6 October 20251.55.1
23 September 20251.55.0
20 August 20251.54.2
1 August 20251.54.1
11 July 20251.54.0
10 July 20251.53.2
30 June 20251.53.1
18 June 20251.53.0
10 June 20251.52.0
17 April 20251.51.1
17 March 20251.51.0
6 March 20251.50.1
31 January 20251.50.0
23 January 20251.49.1
10 December 20241.49.0
18 November 20241.48.2
25 October 20241.48.1
16 October 20241.48.0
8 October 20241.47.2
20 September 20241.47.1
13 September 20241.47.0
5 September 20241.46.1
16 August 20241.46.0
5 August 20241.45.3
22 July 20241.45.2
16 July 20241.45.1
2 July 20241.45.0
24 June 20241.44.1
23 May 20241.44.0
6 May 20241.43.1
12 April 20241.43.0
4 April 20241.42.1
2 March 20241.42.0
27 February 20241.41.2
1 February 2024