Testing Frameworks Release Notes
Updates for test frameworks and runners used to verify software and browser behavior.
Products (2)
Latest Testing Frameworks Updates
- Nov 5, 2026
- Date parsed from source:Nov 5, 2026
- First seen by Releasebot:Nov 5, 2026
v1.65.0
Playwright adds Bun test-runner support, clearer failure reporting, exclusive test locks and new APIs, alongside updates to browser actions, cookie handling and TypeScript behavior. The release also updates browser versions and Docker images.
š„ Run tests with Bun
The test runner now runs under Bun. Bun transpiles your TypeScript test files itself, so Playwright does not use Babel or its compilation cache. Pass the
--bunflag, because without itbunx playwright testruns on Node.js:bunx --bun playwright testOur CI runs the test runner tests under Bun 1.4.3 on Linux. Some features work differently under Bun:
- There is no watch mode. UI mode does not run tests again when files change, and
--only-changeddoes not follow imports. - Bun loads modules itself, so
--tsconfigand the JSX options intsconfig.jsonhave no effect, and custom ESM loaders are not supported. - Stack traces do not include async frames, and API names do not include the class name:
clickinstead oflocator.click. This changes some step locations, step titles and error messages. - Console output of a test does not get into the trace and UI mode.
šØ Reports with only failures
New failures reporter prints failures and successful retries as they occur, followed by a summary, without progress output.
New onlyFailures option of the HTML, JSON and JUnit reporters keeps only tests with unexpected outcomes, flaky tests and interrupted tests:
// playwright.config.ts import { defineConfig } from '@playwright/test'; export default defineConfig({ reporter: [ ['failures'], ['html', { onlyFailures: true }], ], });šÆ Test runner
New built-in
-exclusive-test lock runs a test only when no other tests are running. All other tests continue to run in parallel with each other:test('restart the server', { lock: '-exclusive-' }, async () => { // No other test runs while this one is running. });test.skip(),test.fixme(),test.fail()andtest.slow()now accept only a description. It is recorded in the test annotation:test('upload a file', async ({ page }) => { test.skip('Not implemented yet'); });New
PLAYWRIGHT_TRANSFORM_CACHE_DIRenvironment variable sets the directory for transpiled test files, for example on a Linux machine shared with other users.New APIs
- New options
timeoutandsignalincdpSession.send(). - New
testRun.mode()returns the execution mode of a suite duringreporter.preprocess().
Breaking Changes ā ļø
TypeScript class fields now follow
useDefineForClassFieldsfrom yourtsconfig.json, the same astsc. It is enabled for ES2022 and later targets, and when target is not specified. A field initializer that reads a constructor parameter property now fails, because the initializer runs first:class LoginPage { // TypeError: Cannot read properties of undefined (reading 'getByRole') readonly submit = this.page.getByRole('button', { name: 'Submit' }); constructor(private readonly page: Page) {} }Move the initialization to the constructor, or set
"useDefineForClassFields": falsein yourtsconfig.json.Actions such as
locator.click(),locator.check(),locator.tap(),locator.fill(),locator.clear()andlocator.selectOption()now wait for the element to be not inert. An action on an element with the inert attribute, or inside such an element, now times out if the element stays inert.A sharded run now fails with "No tests found" when no tests match across all shards. Pass
--pass-with-no-teststo allow this. An empty shard still passes when other shards have tests.Cookie matching now follows RFC 6265. With a URL,
browserContext.cookies()andapiRequestContext.cookies()no longer return host-only cookies for subdomains or Path=/api cookies for /apiv2, and a Path=/foo/ cookie does not match /foo.APIRequestContextsends a cookie without a name asCookie: xinstead ofCookie: =x, and storesSet-Cookie: tokenas a cookie without a name.Proxy credentials are no longer sent to websites. The credentials in the proxy option now answer only proxy challenges. To authenticate on a website, use
httpCredentials.Text that the browser does not render, such as text that is not assigned to a slot or text directly inside a closed
<details>, is no longer part of accessible names and aria snapshots. This can change the results ofpage.getByRole()with a name,locator.ariaSnapshot()andexpect(locator).toMatchAriaSnapshot().String and URLSearchParams values of the params option in APIRequestContext requests are now appended to the query that the URL already has, instead of replacing it.
.css,.lessand.scssimports in test files now load as empty modules instead of being removed, so the imported file must exist.The blob reporter again deletes the content of its output directory before it writes the report. Playwright 1.64 kept reports with other names.
Test locations of imported calls such as
test(in CommonJS output now point to the start of the callee, for examplea.spec.ts:3:7instead ofa.spec.ts:3:11. This is the same as in ESM.Announcements
ā ļø Playwright no longer tests on Node.js 20. Use Node.js 22, 24 or 26, as listed in the system requirements.
š³ Docker images now include Node.js 26 instead of Node.js 24, and the latest patch of Chromium on the same branch.
Browser Versions
- Chromium 158.0.8127.18
- Mozilla Firefox 159.0
- WebKit 27.2
This version was also tested against the following stable channels:
- Google Chrome 157
- Microsoft Edge 156
- Nov 2, 2026
- Date parsed from source:Nov 2, 2026
- First seen by Releasebot:Nov 3, 2026
v5.1.0
Vitest adds failed-test reruns, Temporal time support, interactive snapshot review, browser module mocking, and richer trace views, while improving test reliability and performance across its runner, coverage, and reporting tools.
š Features
- Add --last-failed to run only failed tests - by @sheremet-va in #11558 (82f63)
- Support Temporal.Instant and Temporal.ZonedDateTime in vi.setSystemTime() - by @Prajwal2246, Prajwal2246, Claude Opus 5.5 (1M context), @hi-ogawa and Codex (GPT-6) in #11321 (f150f)
- Introduce --since-last-run flag - by @sheremet-va in #11516 (08bd9)
- Expose per-retry/repeat attempt result - by @hi-ogawa, Codex (GPT-6) and Claude Opus 5.5 (1M context) in #11232 (21be4)
- Support fake timers for node:timers and node:timers/promise - by @hi-ogawa, OpenCode and Codex (GPT-6) in #10899 (fbe97)
- Allow coverage providers to store data in fs module cache - by @AriPerkkio in #11747 (54a2b)
- Interactively review failed snapshots - by @macarie and @hi-ogawa in #11325 (54e5b)
browser
- Mock modules through an import map - by @sheremet-va in #11534 (707f8)
- Drop experimental label from trace view - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11518 (44c3c)
- Introduce experimental pointer API - by @macarie in #10780 (5dc09)
- Capture aria snapshot in trace view - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11492 (0cc39)
- Show trace steps timeline on terminal on test failure - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11594 (973dc)
- Add failure-only trace view mode - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11612 (d5d7d)
- Enable failure-only trace view by default - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11766 (f37b6)
coverage
- V8 to support ignoreNode option - by @erickserra and @AriPerkkio in #11688 (e02db)
experimental
- Add trace timeline for node - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11753 (4e985)
- Add message option to vi.waitFor and vi.waitUntil - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11754 (fd145)
š Bug Fixes
- Rerun setup files after --changed filtering - by @sheremet-va in #11621 (3a39c)
- Return the mock to concurrent imports - by @sheremet-va in #11623 (1453b)
- Don't fail on console log pending at teardown - by @sheremet-va in #11619 (a60b8)
- Reference chai types in every d.ts chunk - by @sheremet-va in #11618 (fb150)
- Detect mock factory cycles that form later - by @sheremet-va in #11642 (e9554)
- Skip fs module cache for typed import.meta.glob - by @sheremet-va in #11666 (79501)
- Run tests that import a deleted file - by @sheremet-va in #11669 (80aa1)
- Keep syntax highlighting in code frames - by @sheremet-va in #11705 (d39f5)
- Respect CLI filters when prewarming browsers - by @sheremet-va and Benjamin Tang in #11706 (10947)
- Read cached source as utf-8 - by @juan-fernandez in #11682 and #11709 (867a5)
- Inherit watch from the root config in projects - by @nstepien and Claude Opus 5.5 (1M context) in #11724 (77c12)
- Prefix expect.poll message to all errors - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11756 (cab58)
- Support api.port 0 - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11641 (3667c)
- Show attempts in test error logs of retried tests - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11696 (77a94)
- Preserve rootDir in project paths - by @btea in #11816 (bf96d)
browser
- Change default port to 23315 - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11640 (a2ec4)
- Advance fake timers in actions and expect.element - by @julienw, @hi-ogawa and Claude Opus 5.5 (1M context) in #11242 (68190)
- Drop trace view warning without html reporter - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11665 (e6407)
- Detect shared chunks via the optimizer - by @sheremet-va in #11661 (e2e9c)
- Clear screenshot stability timeout - by @sheremet-va in #11659 (fbe37)
- Measure prepare duration with one clock - by @sheremet-va in #11667 (a3ed4)
- Keep failure screenshot per attempt - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11694 (a5022)
- Print trace timeline of each attempt - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11695 (27229)
- Don't hang in page.viewport() - by @sheremet-va in #11738 (49ff4)
- Skip trace entries after their attempt ended - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11771 (7a56f)
- Focus the iframe before clicking in playwright - by @sheremet-va in #11798 (eb20a)
- Fail the run when a tester cannot connect - by @sheremet-va in #11802 (605bf)
- Treat edge as chromium in toHaveStyle - by @aliamanatali in #11813 (f4dd9)
cache
- Handle concurrent cache clearing - by @7rulnik in #11697 (09076)
- Key module cache on the deps optimizer - by @MO2k4 and Martin Oehlert in #11775 (52485)
- Do not fail when the cache dir is unwritable - by @ezefernandezyf in #11781 (274ab)
cli
- Use camelCase for sinceLastRun help - by @fengmk2 in #11707 (5c674)
coverage
- V8 autoAttachSubprocess to use .tmp directory - by @AriPerkkio in #11632 (de5af)
- V8 to ignore Vite's generated CJS namespace import helper - by @AriPerkkio in #11676 (5901f)
deps
- Update all non-major dependencies - by @sheremet-va in #11637 (2b18e)
expect
- Keep soft .resolves/.rejects error location - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11792 (42770)
mocker
- Don't change the original prototype chain - by @sheremet-va and Max Schwenk in #11737 (cca42)
- Use root mocks for linked packages - by @sheremet-va in #7708 and #11739 (810ec)
runner
- Don't drop throttled task updates - by @sheremet-va in #11795 (8e837)
ui
- Escape search text in explorer highlight - by @sheremet-va in #11672 (3c6d6)
- Fix html reporter crash when --bail cancels files - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11693 (36a5f)
- Fix quirks mode in trace view replay - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11744 (b9b73)
- Let coverage report follow UI color scheme - by @AriPerkkio in #11765 (59c2d)
- Open trace view only for tests with a trace - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11770 (c022d)
vm
- Strip hashbang before compiling CommonJS dependencies - by @cwoebker in #11731 (1a77c)
- Keep node globals after teardown - by @francesco-agnoletto in #11380 and #11681 (a57b4)
- Reset fake timers after each test file - by @francesco-agnoletto in #11679 and #11779 (78c46)
- Keep assignable accessor globals writable in node environment - by @MO2k4 and Martin Oehlert in #11834 (a5ec3)
š Performance
- Reuse fsModuleCache in static collection - by @sheremet-va in #11622 (1766c)
- Cache setup/mock resolves in reused workers - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11760 (5de10)
- Don't refetch warm modules in reused runners - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11761 (4f135)
browser
- Map only first frame for trace locations - by @hi-ogawa and Claude Opus 5.5 (1M context) in #11613 (a967d)
- Disable WebSocketServer's allowSynchronousEvents - by @nstepien in #11794 (d4572)
coverage
- Istanbul to use magic-string+rolldown for instrumentation - by @AriPerkkio in #11648 (2470b)
- Istanbul to collect uncovered files in Promise.all - by @AriPerkkio in #11713 (f1092)
- Istanbul to not store input source maps in coverage data - by @AriPerkkio in #11686 (2debb)
expect
- Compare typed arrays in one loop - by @sheremet-va in #11658 (908eb)
View changes on GitHub
Original source All of your release notes in one feed
Join Releasebot and get updates from Microsoft and hundreds of other software products.
- Oct 19, 2026
- Date parsed from source:Oct 19, 2026
- First seen by Releasebot:Oct 21, 2026
v5.1.0-beta.1
Vitest adds failed-test reruns, since-last-run filtering, richer retry results, Temporal time support, fake timers for Node APIs, browser module mocking, and trace improvements, alongside fixes for test setup, timers, and performance.
š Features
- Add --last-failed to run only failed tests - by @sheremet-va in #11558 (82f63)
- Support Temporal.Instant and Temporal.ZonedDateTime in vi.setSystemTime() - by @Prajwal2246, Prajwal2246, Claude Opus 5.5, Hiroshi Ogawa and Codex (GPT-6) in #11321 (f150f)
- Introduce --since-last-run flag - by @sheremet-va in #11516 (08bd9)
- Expose per-retry/repeat attempt result - by @hi-ogawa, Hiroshi Ogawa, Codex (GPT-6) and Claude Opus 5.5 in #11232 (21be4)
- Support fake timers for node:timers and node:timers/promise - by @hi-ogawa, Hiroshi Ogawa, OpenCode and Codex (GPT-6) in #10899 (fbe97)
browser
- Mock modules through an import map - by @sheremet-va in #11534 (707f8)
- Drop experimental label from trace view - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11518 (44c3c)
- Introduce experimental pointer API - by @macarie in #10780 (5dc09)
- Capture aria snapshot in trace view - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11492 (0cc39)
š Bug Fixes
- Rerun setup files after --changed filtering - by @sheremet-va in #11621 (3a39c)
- Return the mock to concurrent imports - by @sheremet-va in #11623 (1453b)
- Don't fail on console log pending at teardown - by @sheremet-va in #11619 (a60b8)
- Reference chai types in every d.ts chunk - by @sheremet-va in #11618 (fb150)
browser
- Change default port to 23315 - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11640 (a2ec4)
- Advance fake timers in actions and expect.element - by @julienw, Hiroshi Ogawa and Claude Opus 5.5 in #11242 (68190)
coverage
- V8 autoAttachSubprocess to use .tmp directory - by @AriPerkkio in #11632 (de5af)
deps
- Update all non-major dependencies - by @sheremet-va in #11637 (2b18e)
š Performance
- Reuse fsModuleCache in static collection - by @sheremet-va in #11622 (1766c)
- browser: Map only first frame for trace locations - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11613 (a967d)
View changes on GitHub
Original source - Oct 15, 2026
- Date parsed from source:Oct 15, 2026
- First seen by Releasebot:Oct 16, 2026
v5.0.5
Vitest fixes test cancellation, hook cleanup, mock release, browser handling, and changed-file parsing, while improving plugin startup and error reporting for more reliable test runs.
š Bug Fixes
- Keep vite default fs.deny with api token file - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11578 (28dc1)
- Handle quoted file names in --changed - by @sheremet-va in #11583 (14921)
- Add data to the import.meta.hot stub - by @sheremet-va in #11590 (3a828)
- Set skip in skipIf, ignore undefined options - by @sheremet-va in #11591 (d523a)
- Skip builtin loading in async leak detector - by @sheremet-va in #11598 (fe86a)
- Keep the import frame in native loader errors - by @sheremet-va in #11599 (9697b)
- Run hook cleanups when a later hook fails - by @sheremet-va in #11605 (6c5a4)
- Release mocks of finished test files - by @sheremet-va in #11607 (e9c3d)
- Abort all running tests on cancel - by @sheremet-va in #11606 (6621a)
browser
- Ignore synthetic pagehide events - by @sheremet-va in #11582 (ca081)
- Run plugin buildStart on server creation - by @sheremet-va in #11593 (ea611)
- Drop late connections of closed sessions - by @sheremet-va in #11600 (f161e)
- Wait 30s for the browser to close - by @sheremet-va in #11601 (6498b)
- Run global setup once with instances - by @sheremet-va in #11596 (8dd67)
reporter
- End reason 'failed' on worker crash - by @AriPerkkio in #11568 (6ae8e)
View changes on GitHub
Original source - Oct 15, 2026
- Date parsed from source:Oct 15, 2026
- First seen by Releasebot:Oct 16, 2026
v4.1.12
Vitest hardens manual and redirect mocks with a bug fix backported to v4.
š Bug Fixes
- mocker: Harden manual and redirect mocks [backport to v4] - by @sheremet-va in #11580 (b8253)
View changes on GitHub
Original source - Oct 14, 2026
- Date parsed from source:Oct 14, 2026
- First seen by Releasebot:Oct 15, 2026
v1.64.1
Playwright fixes intermittent Electron startup window loss and Chromium failures on preflighted cross-origin redirects when routes are registered.
Bug Fixes
- #43247 [Bug]: _electron.launch intermittently loses a packaged app's first window since 1.64.0
- #43242 [Regression]: Chromium 155+ aborts a preflighted cross-origin redirect whenever any route is registered (net::ERR_ABORTED)
- Oct 13, 2026
- Date parsed from source:Oct 13, 2026
- First seen by Releasebot:Oct 14, 2026
v5.0.4
Vitest releases updates with experimental dependency caching, improved test UI and trace viewer controls, clearer --changed results, and broad fixes across browser testing, coverage, mocks, snapshots, and performance.
š Features
experimental
- Tag cache directories with CACHEDIR.TAG - by @lifeiscontent in #11461 (a8ea3)
- Support test.ui.theme option - by @sheremet-va in #11499 (1da66)
- Highlight selector multiple matches in trace view - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11489 (5abba)
- Print how many tests were affected and a total when running --changed - by @sheremet-va in #11424 (a2336)
- Add an option to cache dependencies instead of statically parsing them - by @sheremet-va in #11515 (c0601)
- Add fit and zoom controls to trace viewer - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11490 (f5dd9)
š Bug Fixes
- Fail the run on git and location filter errors - by @sheremet-va in #11430 (30d03)
- Enable fsModuleCache by default - by @sheremet-va in #11435 (ad208)
- Track project files and mocks with --changed - by @sheremet-va in #11432 (b0f2b)
- Refactor caching, fix : in project and change the shape of results cache - by @sheremet-va in #11453 (9673c)
- Keep full $ string values when taskTitleValueFormatTruncate is 0 - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11485 (4f7e1)
- Resolve node builtins in client environments - by @sheremet-va in #11417 (56b31)
- Fix module graph builtin externals after #11421 - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11491 and #11421 (008e1)
- Wrap module mocks during in-source testing - by @sheremet-va in #11505 (36d19)
- Handle line endings in snapshot - by @sheremet-va in #11522 (4c468)
- Respect root in projects - by @sheremet-va in #11521 (26642)
- Resolve mocks in directories with spaces - by @sheremet-va in #11539 (caaef)
api
- Publish the api token atomically - by @umairnawaz333 in #11323 (6f990)
browser
Close the mock route interception race - by @cplieger and @sheremet-va in #8339 and #11083 (d6620)
Allow toHaveTextContent without arguments - by @nomadical in #11425 (8ebcf)
Apply API options without browser config - by @sheremet-va in #10852 (ad055)
Preserve undefined command arguments - by @sheremet-va and @AriPerkkio in #11497 (1576d)
Wait for setup mocks before importing a test file - by @kasperpeulen in #11520 (b61d1)
Avoid extra scroll outside the iframe - by @sheremet-va in #11523 (662e8)
Run browser instances as workers - by @sheremet-va in #11525 (bf04b)
ā ļø This can degrade performance if you have a custom maxWorkers setting. Previously, it was applied incorrectly and could lead to Vitest using too many resources. For example, a lower number would still open too many browsers. Fixing it means Vitest opens less instances by default now.
Open one cdp session per tester - by @sheremet-va in #11542 (69e63)
Clean up unmocked and pending mocks - by @sheremet-va in #11537 (5c955)
coverage
- V8 browser memory leak between test files - by @AriPerkkio in #11466 (2297d)
- allowExternal fails to include uncovered files - by @AriPerkkio in #11513 (4ef00)
- Filenames containing brackets incorrectly showing as uncovered - by @AriPerkkio in #11531 (0fa80)
- Istanbul coverage wrong when module transform warmups - by @AriPerkkio in #11529 (9f61d)
deps
- Update all non-major dependencies - by @sheremet-va in #11167 (c74e0)
expect
- Fix Map and Set deep equality in some assertions - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11402 (b4e79)
- Check value in chai-style returned - by @sheremet-va in #11500 (1aca0)
mocker
- Fix native loader mocking edge cases - by @sheremet-va in #11540 (cd423)
pretty-format
- Support boxed symbols - by @lehni in #11445 and #11446 (eba44)
reporters
- Junit to strip ANSI sequences from all XML attributes - by @meganemura and Claude Opus 5.5 in #11407 (e1a73)
runner
- Don't cache failed fixture setups - by @hamed-bavar in #11237 and #11238 (4ee66)
typecheck
- Use typescript pool in toTestSpecification - by @sheremet-va in #11451 (5f273)
ui
- Remove duplicate browser-open call opening two tabs - by @feastyr69 in #11356 and #11358 (d7e13)
- Simplify explorer filtering + fix nested tests when search matches a suite - by @hi-ogawa, Hiroshi Ogawa, Codex and Claude Opus 5.5 in #11262 (a627b)
- Store module graph once per environment - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11421 (af903)
- Mount index.html handler on the ui base path - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11517 (1bc24)
- Center split pane resize handle - by @hi-ogawa, Hiroshi Ogawa and Claude Opus 5.5 in #11506 (e658b)
vm
- Bind this to module.exports - by @sheremet-va in #11504 (b618a)
š Performance
- Reuse fsModuleCache when filtering by source - by @sheremet-va in #11428 (7ebd9)
- spy: Reset only mocks that were called or reconfigured - by @johan-gorter and Claude Opus 5.5 in #11197 (28ef9)
View changes on GitHub.
Original source - Oct 7, 2026
- Date parsed from source:Oct 7, 2026
- First seen by Releasebot:Oct 15, 2026
v1.64.0
Playwright adds experimental WebMCP access, customizable video recording, and more flexible test-runner controls. It also introduces relative locators and new APIs, alongside updates to browser emulation, JSX handling, and snapshot behavior.
š§° WebMCP
New
page.webmcpandframe.webmcpgive 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-cli exposes 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 intestOptions.video,recordVideoandscreencast.start(). Firefox and WebKit currently capture up to 25 frames per second.New
styleoption takes CSS declarations for the point marker, the target highlight and the action title. 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.defaultoption keeps a project in the config without running it by default. You can configure every browser you care about, and let a plainnpx 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 CINew
--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 271828182New
lockoption intest.describe.configure()adds test locks to all tests in a file or a group:test.describe.configure({ lock: 'user-settings' });New
typeoption oftoHaveScreenshotintestConfig.expectstores 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()orlocator.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 bypage.ariaSnapshot()in the 'ai' mode.New option
includeShadowinpage.content()andframe.content()serializes open shadow roots as declarative shadow DOM.New option
signCountsets the initial signature counter of a virtual credential.credentials.create()andcredentials.get()return the currentsignCount, and it is saved and restored together with the credentials in the storage state.New
fullConfig.filteredProjectslists the projects that were selected to run after applying the--projectfilter. It is available in global setup and reporters.New
apiRequestContext.addCookies(),apiRequestContext.cookies()andapiRequestContext.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 ā ļø
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 settingscreento undefined:// playwright.config.ts export default defineConfig({ use: { ...devices['Desktop Chrome'], screen: undefined, }, });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.--update-snapshots=missingnow passes the test run. Tests that only create missing snapshots now pass in the 'missing' mode oftestConfig.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.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()andexpect(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
Original source - Sep 30, 2026
- Date parsed from source:Sep 30, 2026
- First seen by Releasebot:Sep 30, 2026
v5.0.3
Vitest fixes browser, cache, expect, jsdom, and UI behavior with a broad round of bug fixes, including better retry handling, safer mock boundaries, improved screenshot references, and cleaner environment and pool handling.
š Bug Fixes
Isolate result.status between repeats runs - by @hi-ogawa, Hiroshi Ogawa and Codex (GPT-6) in #11218 (5dbeb)
Don't print an interceptor warning in browser mode - by @sheremet-va in #11377 (15cc0)
Don't retry when test.fails expectedly failed - by @hi-ogawa, Hiroshi Ogawa and Codex (GPT-6) in #11219 (b2458)
Scope cache key generators to projects - by @ecoyoung in #11281 and #11301 (92ba7)
browser:
Delay server listen until tests start running - by @sheremet-va in #11366 (7d8ed)
Check mock path boundaries - by @saryn17, Ryosei Sato and @sheremet-va in #11361 and #11362 (1c388)
Keep config of browser-consumed environments - by @kasperpeulen and Claude in #11378 (aafc0)
Ignore page crash while cancelling - by @sheremet-va in #11386 (7c367)
toMatchScreenshot uses wrong reference on retried tests - by @macarie in #11393 (c22ab)
cache:
Revalidate imports of cached modules - by @sheremet-va in #11381 (38f98)
deps:
Pin why-is-node-running to 3.2.1 to avoid users running into ERR_PNPM_TRUST_DOWNGRADE - by @AriPerkkio in #11403 (f6c9a)
expect:
Pass current equality testers to expect.extend asymmetric matchers - by @hi-ogawa, Hiroshi Ogawa and Claude in #11401 (3e794)
jsdom:
Support Blob on jsdom 30.1 - by @sheremet-va in #11379 (6c49b)
pool:
Preserve unique pool ids when groupOrder is set - by @mtorp in #11392 (50312)
ui:
Split-pane handle overlapping iframe - by @macarie in #11221 (f91db)
vitest:
Remove root temp dir on close - by @abhinav-phi in #11248 (7c711)
vm:
Do not optimize deps from index.html - by @ezefernandezyf, Hiroshi Ogawa and Codex (GPT-6) in #11329 and #11360 (caf28)
Don't reuse scripts across vite environments - by @MO2k4, Martin Oehlert and Claude in #11395 (346d3)
View changes on GitHub
Original source - Sep 25, 2026
- Date parsed from source:Sep 25, 2026
- First seen by Releasebot:Sep 26, 2026
v5.0.2
Vitest fixes several bugs across expect, jsdom, reporters, spies, and process handling, while improving the UI by persisting authentication cookies beyond the current browser session.
š Bug Fixes
Bind process in case global is overwritten - by @AriPerkkio in #11343 (0b792)
detect-async-leaks:
Ignore process.stdio handles - by @AriPerkkio in #11333 (0fd6b)
expect:
Fix toMatchObject with asymmetric matchers - by @ShreeBohara, Claude Opus 5, @hi-ogawa, Hiroshi Ogawa and Codex (GPT-5) in #11100 (42523)
jsdom:
Fix Request with Blob body on jsdom 28+ - by @harshit-d3v in #11295 (d1c3e)
reporter:
agent to respect --silent - by @Raj4478 and @AriPerkkio in #11271 (5b95e)
reporters:
Handle concurrent createReport calls - by @7rulnik in #11278 (e8e55)
hanging-process to use ESM entrypoint - by @AriPerkkio in #11316 (4e91e)
spy:
Fix stack overflow when spying Set.prototype.add - by @fengmk2 in #11299 (a0a93)
ui:
Persist authentication cookie beyond current browser session - by @hi-ogawa, Hiroshi Ogawa and OpenCode (gpt-5.6-sol) in #11066 (f8819)
View changes on GitHub
Original source