github.com has no runner for hanzo-build-linux-amd64, so a caller under
.github/workflows is a gate that can never be scheduled. This is the ~7-line
caller on the plane that can (git.hanzo.ai git-runner fleet), pinned @v1.
Add the `Version 1.62` section to `release-notes-python.md`, `release-notes-java.md`, and `release-notes-csharp.md`, covering the cross-language 1.62 features:
- WebP screenshots via [`method: Page.screenshot`] / [`method: Locator.screenshot`]
- new `scroll` action option
- [`method: Locator.waitForFunction`]
- [`method: APIResponse.timing`]
Should be cherry-picked to `release-1.62` alongside the language rolls.
headless browsers keep the clipboard to themselves instead of sharing the clipboard of the operating system, which WebKit on macOS started doing in build `2334`
announce it in the 1.62 release notes so that anyone who relied on the clipboard of the machine being involved knows what changed
the terminal reporters automatically append a test's tags to its title, which clutters the output when a test declares many tags
add an off-by-default `omitTags` option that suppresses the appended tags in the `list`, `line`, `dot`, `github`, and `junit` reporters
note that tags written directly into a test title are left untouched
fixes <https://github.com/microsoft/playwright/issues/41945>
`browser_type` escapes user input but `browser_press_sequentially` right below it doesn't. Something like "it's working" ends up producing invalid JS in the codegen. Looked around and a "few other tools" had the same gap while `evaluate.ts`, `form.ts`, `verify.ts` already handle it fine through `escapeWithQuotes()`. Figured it made sense to just bring the rest in line.
Release notes for the upcoming **v1.62** release.
### Highlights
- **New component testing model** — stories & galleries with the new `mount` fixture
- **AbortSignal** support on operations and web-first assertions (`signal` option)
- **WebP screenshots** — store `toHaveScreenshot()` snapshots as `.webp`
- **`Reporter.preprocess()`** hook for custom test filtering
- **Isolated retries** via `retryStrategy: 'isolated'`
### Also includes
- New APIs: WebAuthn passkeys in storage state (`storageState.credentials`), `APIResponse.timing()`, `Locator.waitForFunction()`, functions as `evaluate`/`addInitScript` args, `scroll` action option
- CLI/MCP: Playwright now bundles the MCP server and `playwright-cli` (`npx playwright mcp` / `npx playwright cli`)
- HTML reporter `mergeFiles` config option
- Announcement: Debian 11 is no longer supported
- Browser versions: Chromium 151.0.7922.34, Firefox 153.0, WebKit 26.5
Validated locally with `npm run doc`.
`defaultCacheDirectory` used to be computed inside the `PLAYWRIGHT_BROWSERS_PATH` branch of `registryDirectory`, so setting that variable skipped the platform check
<https://github.com/microsoft/playwright/pull/39423> hoisted it into an eagerly evaluated module constant, so it now throws `Unsupported platform: <platform>` at import, before `registryDirectory` consults `PLAYWRIGHT_BROWSERS_PATH`
this regressed setups that point `PLAYWRIGHT_BROWSERS_PATH` at their own browsers on platforms without a default cache directory, such as Android/Termux
evaluate `defaultCacheDirectory`, `defaultRegistryDirectory`, and `baseDaemonDir` lazily so an explicit `PLAYWRIGHT_BROWSERS_PATH` is honored before any default cache directory is computed
`registryDirectory` still throws eagerly when no override is set, since there is nowhere to place browsers
fixes <https://github.com/microsoft/playwright/issues/41852>
WebKit has no `Runtime.addBinding`, so the webview delegate has to handle bindings through `console.debug(BINDING_CALL_TAG, payload)` instead
the console message carries no execution context id, so every call was dispatched against the main frame, meaning a callback fired from a child frame (e.g. `frame.evaluate(..., { exposeFunctions: true })`) reached the wrong `BindingsController` and never resolved the calling frame's pending promise, hanging until the 30s timeout tore the page down
tag each call with an empty object created in the calling context, as an `objectId` carries the injected script id, meaning that the host can route the call to the frame it came from and release the marker afterwards
when a browser binary is missing, `throwIfExecutableMissing` caught playwright-core's `Executable doesn't exist at <path>` and rethrew a generic `Browser "<name>" is not installed`, dropping the path
that path holds the version-specific directory (e.g. `firefox-1534`), which is what tells a genuinely missing install apart from a version mismatch
browsers from a standalone `playwright install` land in a differently-versioned directory than the bundled `playwright-core` expects
keep the path in the rethrown message so the mismatch is diagnosable
this is a further improvement for <https://github.com/microsoft/playwright/pull/40867>
referenced in <https://github.com/microsoft/playwright/issues/41871>