What’s Changed and Upgrading

This content was generated with the assistance of AI and should be verified against the official documentation before being relied on in production.

The reference material consulted while preparing these pages is listed in the section bibliography.

Browser testing tools move quickly: Playwright ships a minor release roughly every month, Cypress shipped a new major version in September 2026, and Selenium publishes a release every few weeks. This page collects the changes that matter to someone maintaining an existing suite or writing a new one, organised by tool, and for every change it states the version that introduced it, where this section documents it, and what an upgrade needs from you. It is written for Playwright 1.64.1, Cypress 16.2.0 and Selenium 4.51.0, and every version, date and requirement was checked against the official release notes, changelogs and migration guides on 25 October 2026.

Nothing on this page needed a running Bookshelf application. The only commands executed were version checks: in the Playwright example project npx playwright --version printed Version 1.64.1, and in the Cypress example project npx cypress --version reported Cypress package and binary version 16.2.0 (Electron 41.7.0). The migration snippets below come from the official guides and were not run here; the pages linked in the tables contain the examples that were run against Bookshelf. Items on this page that depend on commercial services or on AI products that need accounts or paid keys are described from their official announcements and documentation.

How to approach an upgrade

The same routine works for all three tools, and it keeps the number of simultaneous variables low.

  1. Read the release notes between your version and the target. Skipping versions is allowed for minor releases, but the breaking changes accumulate, so read every version in between. Cypress and the other major-version tools ask for one major at a time: the Cypress 16 migration guide explicitly says to be on 15.x first.

  2. Upgrade the runtime before the tool. Node.js, Python, the JDK and the operating system are the usual blockers; each section below lists the versions that were dropped.

  3. Pin the version. Use an exact version in package.json, pom.xml or requirements.txt, and upgrade deliberately in a dedicated branch. Browser binaries move with the tool (Playwright) or independently of it (Cypress, Selenium), so record the browser versions too.

  4. Run the suite once without changes and read the failures by category. Most upgrade failures come from changed defaults (visibility, headless mode, snapshot behaviour), removed APIs and updated screenshots, not from the tests.

  5. Regenerate visual baselines in a controlled run and review the differences, as described in Visual Regression Testing.

  6. Update the container images and CI actions at the same time, because the browser and the runner must match; see Running in CI/CD.

npm install --save-exact --save-dev @playwright/test@1.64.1
npx playwright install --with-deps
npx playwright --version

Executed here: npx playwright --version printed Version 1.64.1 for the pinned example project; the install commands are the documented upgrade steps and were already part of the project setup.

Playwright 1.49 to 1.64

Playwright 1.49 (late 2024) to 1.64 (October 2026) covers sixteen releases. The tables group the changes by theme; the last two tables list everything that was removed or changed incompatibly and the runtime requirements.

Locators and assertions

Version Change Documented here Upgrade action

1.49

expect(locator).toMatchAriaSnapshot() compares the accessibility tree, written as YAML, with an expected snapshot. 1.50 allows snapshots in separate YAML files and adds toHaveAccessibleErrorMessage(); 1.52 adds /children for strict matching and /url for links; 1.59 adds page.ariaSnapshot(), the depth and mode options and boxes (1.60); 1.60 lets toMatchAriaSnapshot() run on a page; 1.63 adds ariaSnapshotJSON().

Assertions, Accessibility Checks in E2E Tests

Optional. Adopt it for structural checks; generate snapshots with codegen and update them with --update-snapshots.

1.51

locator.filter({ visible: true }) matches only visible elements.

Locators, Actions & Auto-Waiting

Optional; replaces ad-hoc :visible CSS selectors.

1.52

expect(locator).toContainClass() asserts individual class names.

Assertions

Optional; replaces regular expressions against the class attribute.

1.53

locator.describe() names a locator for traces and reports.

Debugging, Tracing & Codegen

Optional.

1.59

locator.normalize() rewrites a locator to follow best practice (test ids and roles), and page.pickLocator() lets you point at an element to get its locator.

Locators, Actions & Auto-Waiting

Optional.

1.60

getByRole() gains a description option (accessible description); toHaveCSS() gains pseudo; locator.drop() simulates an external drag-and-drop of files.

Locators, Actions & Auto-Waiting

Optional.

1.63

locator.visible() returns a locator that matches only visible elements and is the recommended replacement for the :visible CSS pseudo-class; page.frameLocator() without a selector searches every frame.

Locators, Actions & Auto-Waiting

Replace :visible selectors when convenient; they still work.

1.64

locator.within(parent) combines two locators ("this button, within that dialog") and resolves nth() and first() per parent; page.getByRef() locates an element by the aria reference reported by page.ariaSnapshot() in the ai mode.

Locators, Actions & Auto-Waiting

Optional. getByRef() is meant for agents driving a page, not for hand-written tests.

Agents, MCP and the command line

Version Change Documented here Upgrade action

1.51

A Copy prompt button on errors in the HTML report, the trace viewer and UI Mode copies a prompt that contains the error message and context for an AI assistant. 1.56 adds an option to the HTML reporter to disable the button.

Debugging, Tracing & Codegen

None. Disable the button in the reporter options if you do not want it shown to your team.

1.56

Playwright Test Agents: three agent definitions (planner, generator and healer) that guide an LLM through writing tests. npx playwright init-agents generates the definitions for VS Code, Claude Code (--loop=claude) or opencode.

Playwright Test Agents

Optional. Regenerate the agent files after each Playwright upgrade, because the definitions track the release.

1.59

browser.bind() makes a launched browser available to playwright-cli, @playwright/mcp and other clients; npx playwright test --debug=cli and npx playwright trace give coding agents a command-line debugger and trace analysis.

Advanced Topics, Playwright MCP & CLI

Optional.

1.62

Playwright bundles the Playwright MCP server and playwright-cli, runnable as npx playwright mcp and npx playwright cli.

Playwright MCP & CLI

Optional. You no longer need a separate @playwright/mcp install to match the test runner version.

1.64

WebMCP: page.webmcp and frame.webmcp expose the tools a page registers through the experimental WebMCP browser API (launch Chromium with --enable-features=WebMCP). Playwright MCP offers them to agents as webmcp_<tool>, with --no-webmcp to opt out, and playwright-cli has webmcp-list and webmcp-call.

Playwright MCP & CLI, How AI Agents Drive Browsers

Review what an agent can now call on your own pages; see Securing Browser Agents.

At the check date the npm packages were @playwright/mcp 0.0.83 and @playwright/cli 0.1.22, both still 0.x, so expect their flags to change between releases and pin them as you would any other test dependency.

Browsers, video, traces and reports

Version Change Documented here Upgrade action

1.49

The chrome and msedge channels switch to the new headless mode; the chromium channel opts into it. WebKit stops getting updates on Ubuntu 20.04 and Debian 11.

Cross-Browser Testing

Run the suite once; expect to update screenshots and PDF or extension tests.

1.57

Playwright runs on Chrome for Testing builds instead of Chromium: headed mode uses chrome, headless mode uses chrome-headless-shell. Linux arm64 kept Chromium until 1.63, when it also moved to Chrome for Testing. The HTML report gets the Speedboard tab, and webServer.wait waits for a regular expression in the server output.

Getting Started, Cross-Browser Testing

Re-download browsers with npx playwright install; the release notes expect no functional change, but the browser icon and title differ.

1.59

The Screencast API (page.screencast.start(), showActions(), showChapter(), showOverlay(), frame callbacks) as an alternative to recordVideo. tracing gains the retain-on-failure-and-retries mode.

Advanced Topics, Screenshots, Videos & Traces

Optional; use it for evidence videos with action annotations.

1.60

tracing.startHar() and stopHar() expose HAR recording; testInfoError.errorContext carries the aria snapshot at the time of a failed expect.

Screenshots, Videos & Traces

Optional.

1.62

.webp snapshot names store toHaveScreenshot() baselines as lossless WebP; the clipboard is isolated from the operating system in headless mode.

Visual Regression Testing

Keep PNG baselines unless you want to switch; mixing formats needs a baseline refresh.

1.63

Traces can record aria and screen snapshots (snapshots: { dom, aria, screen }) with a Display Aria mode in the trace viewer; a Perfetto reporter writes a timeline of the run.

Screenshots, Videos & Traces

Optional.

1.64

Video can use a custom frame rate (fps) and CSS-styled action decorations and is encoded with VP9 instead of VP8.

Screenshots, Videos & Traces

Optional; the fontSize video option is deprecated in favour of style.

State, authentication and component testing

Version Change Documented here Upgrade action

1.51

storageState({ indexedDB: true }) saves and restores IndexedDB, for example Firebase authentication tokens.

Authentication & Isolation

Add the option if your application keeps its session in IndexedDB.

1.59

browserContext.setStorageState() replaces the cookies, local storage and IndexedDB of an existing context.

Authentication & Isolation

Optional.

1.61

The WebStorage API (page.localStorage, page.sessionStorage) and the Credentials virtual authenticator (browserContext.credentials) for WebAuthn passkeys.

Authentication & Isolation

Optional; replaces evaluate() calls against localStorage and manual virtual-authenticator setup.

1.62

New component testing model: stories plus a gallery page and the mount() fixture. The experimental @playwright/experimental-ct-react, -ct-react17 and -ct-vue packages stop receiving updates (announced in 1.63).

Component Testing

Migrate component tests before the old packages fall behind the test runner; the page explains the path.

1.63

storageState can include the origin private file system (opfs); 1.62 can include virtual credentials.

Authentication & Isolation

Optional.

1.64

signCount on virtual credentials; apiRequestContext.addCookies(), cookies() and clearCookies().

Authentication & Isolation, Network Mocking, Clock & API Testing

Optional.

Test runner, parallelism and reporting

Version Change Documented here Upgrade action

1.50

test.step accepts a timeout; test.step.skip(); updateSnapshots: 'changed' and updateSourceMethod.

Configuration, Fixtures & Projects

See the breaking-change table: all now rewrites every snapshot.

1.52

testConfig.failOnFlakyTests and testProject.workers.

Parallelism, Sharding & Retries, Flaky Tests & Reliability

Enable failOnFlakyTests in CI if you want flaky passes to fail the run.

1.56

--test-list and --test-list-invert run the tests named in a file.

Parallelism, Sharding & Retries

Optional.

1.62

retryStrategy: 'isolated' runs all retries at the end in a single worker; AbortSignal support in actions and assertions.

Parallelism, Sharding & Retries

Optional.

1.63

Test locks: { lock: 'name' } on a test or test.describe() keeps tests that share a named resource from running at the same time across files, workers and projects. --add-reporter appends to the configured reporters.

Parallelism, Sharding & Retries

Use locks for shared external state instead of serial mode.

1.64

testProject.default keeps a project in the configuration without running it by default; --shuffle randomises the order and prints a seed; test.describe.configure({ lock }); toHaveScreenshot: { type: 'webp' } in expect.

Configuration, Fixtures & Projects, Flaky Tests & Reliability

Optional; --shuffle is a cheap way to find order-dependent tests.

Removed features and breaking changes

Read this table before moving across the listed versions; each row is a change that can fail a previously green suite.

Version Breaking change Upgrade action

1.49

chrome and msedge channels use the new headless mode. The @playwright/experimental-ct-vue2 and -ct-solid packages are no longer updated.

Re-run the suite and refresh screenshots.

1.50

toBeEditable() and isEditable() throw if the element is not an editable element. updateSnapshots: 'all' now rewrites every snapshot; 'changed' keeps the old behaviour.

Use changed in scripts that meant "update what differs".

1.52

URL glob patterns in page.route() no longer support ? and []. route.continue() ignores a Cookie header override. WebKit updates stop for macOS 13.

Use regular expressions in route patterns; set cookies on the context.

1.54

Node.js 16 support removed and Node.js 18 deprecated. The -gv flag is gone (use --grep-invert) and npx playwright open no longer opens the recorder (use codegen).

Update scripts and CI to the runtimes in the table below.

1.55

Chromium extension manifest v2 support dropped.

Port extensions to manifest v3; see Advanced Topics.

1.56

browserContext.on('backgroundpage') is deprecated and never emitted.

Use service-worker based extension testing.

1.57

page.accessibility removed after three years of deprecation.

Use an axe integration; see Accessibility Checks in E2E Tests.

1.58

The _react and _vue selectors, the :light selector suffix and the devtools launch option are removed. WebKit updates stop for macOS 13.

Use role, test id or CSS locators; pass --auto-open-devtools-for-tabs through args.

1.59

WebKit updates stop for macOS 14. @playwright/experimental-ct-svelte removed. The JUnit reporter separates errors from failures.

Check CI parsers that read <failure> elements.

1.60

Long-deprecated APIs removed: Locator.ariaRef(), the handle option of exposeBinding, the logger option of connect and connectOverCDP, and the videosPath and videoSize context options.

Use ariaSnapshot(), tracing and recordVideo.

1.62

Debian 11 is no longer supported.

Move CI to a supported image.

1.63

Ubuntu 20.04 is no longer supported. The experimental React and Vue component-testing packages stop being updated.

Use a current mcr.microsoft.com/playwright image.

1.64

screen from device descriptors is now forwarded, so window.screen and media queries see the emulated size. JSX in test files follows your tsconfig.json. --update-snapshots=missing makes a run that only creates snapshots pass. Elements inside hidden iframes count as hidden.

Set screen: undefined to opt out of the first; review tests that rely on the others.

Runtime and operating-system requirements

Item Status at Playwright 1.64.1 Documented here

Node.js

22.x, 24.x or 26.x. Node.js 16 was removed in 1.54, and Node.js 18 was deprecated there. The release notes between 1.55 and 1.64 do not announce the exact release that removed 18 and 20, so read the requirements page when planning.

Getting Started

Operating systems

Windows 11 and later, Windows Server 2019 and later, WSL, macOS 14 and later, Debian 12 and 13, and Ubuntu 22.04, 24.04 and 26.04 on x64 or arm64. Ubuntu 26.04 arrived in 1.61 and Debian 13 in 1.55. The 1.59 notes also say WebKit stopped being updated on macOS 14, so check the system requirements page for the browser you need.

Getting Started

Docker images

The images moved from Node.js 22 to 24 in 1.57 (and from 20 to 22 in 1.49); use mcr.microsoft.com/playwright:v1.64.1-noble for 1.64.1.

Running in CI/CD

Python, Java and .NET bindings

Newer releases than the 1.63.0 used for the examples exist (Python 1.64.1, Maven 1.64.0, NuGet 1.64.1). Python 3.10 or later is required.

Python, Java & .NET

Cypress 15 to 16

Cypress 15.0.0 (August 2025) and 16.0.0 (1 September 2026) are the two majors in this window. Version 16.2.0 was released on 13 October 2026.

Breaking changes in 16.0

The official migration guide lists each change with an "action needed" column; this table follows it.

Change What happens Documented here Upgrade action

Native browser network

Chrome, Chromium and Edge send test traffic over the native browser network, so the application negotiates HTTP/1.1, HTTP/2 or HTTP/3 exactly as in production. Firefox, WebKit and Electron keep the legacy path. req.httpVersion is no longer reported and compression headers and 304 responses behave differently inside cy.intercept().

Network, Stubs, Spies & Clocks

Usually none. Update tests that assert on those fields; forceHttp1: true is a temporary escape hatch that is deprecated at introduction.

Node.js

Node.js 20 and 25 are dropped; 22.x, 24.x or 26.x and later are required. The bundled Node.js moved from 22.19.0 to 24.15.0.

Getting Started

Upgrade the runtime on developer machines and CI before the package.

Cypress.env() removed

Use cy.env() for sensitive values and Cypress.expose() for public values. The env key is invalid in per-test overrides (use expose), and the allowCypressEnv option is gone.

Sessions, Authentication & Cross-Origin, Running in CI/CD

Migrate every call (see the example below). CYPRESS_* variables fill env only, so pass public values with --expose.

cy.exec() and cy.end() removed

Use cy.task() (and taskTimeout) instead of cy.exec(); delete .end() calls.

Getting Started

Register the command as a task in setupNodeEvents.

keystrokeDelay

The default delay in cy.type() changed from 10 to 0 milliseconds.

Core Concepts

Only if a test relied on the delay: set keystrokeDelay: 10 or pass { delay: 10 }.

Visibility

experimentalFastVisibility is replaced by visibilityStrategy, which defaults to 'modern'; 'legacy' is a deprecated escape hatch.

Core Concepts

Rewrite assertions that relied on ancestor overflow clipping, transform-based hiding or coverage by fixed elements.

Browser memory

experimentalMemoryManagement became manageBrowserMemory, on by default.

Debugging, Studio, Plugins & Reporters

If you set the old option to false, replace it with manageBrowserMemory: false; deleting it silently turns the feature on.

Cookie and storage reads

cy.getCookie(), cy.getCookies(), cy.getAllCookies(), cy.getAllLocalStorage() and cy.getAllSessionStorage() are retry-able queries governed by defaultCommandTimeout and can no longer be overwritten with Commands.overwrite().

Queries, Assertions & Custom Commands

Move assertions from .then() to .should(); use overwriteQuery().

Config at run time

viewportWidth, viewportHeight and blockHosts cannot be changed with Cypress.config() during a test.

Core Concepts

Use cy.viewport() or test configuration.

Other removals

experimentalSourceRewriting, built-in CoffeeScript support, and the environment variables printed by cypress info.

Debugging, Studio, Plugins & Reporters

Remove the options; convert .coffee files.

Component testing minimums

Angular 21 (18, 19 and 20 dropped), Vite 8 (5, 6 and 7 dropped), Next.js 15.0.4 (14 dropped). @cypress/angular-zoneless merged into @cypress/angular.

Component Testing

Upgrade the framework tooling first.

Electron deprecated

The bundled Electron browser is deprecated as a test browser and will be removed in a future major version; targeting it prints a warning.

Cross-Browser Testing

Set defaultBrowser or pass --browser chrome now.

The example below is the migration pattern from the official guide, shown with the replacement for a secret and for a public value. It is documentation, not a run.

// Before (Cypress 15): synchronous, everything is serialised into the browser
// const apiKey = Cypress.env('apiKey')

// After (Cypress 16): sensitive values stay in the Node process until requested
it('reads the API key', () => {
  cy.env(['apiKey']).then(({ apiKey }) => {
    expect(Boolean(apiKey)).to.be.true
  })
})

// Public configuration: declare it in the config under `expose`
// and read it synchronously
const apiVersion = Cypress.expose('apiVersion')
cypress run --expose FEATURE_FLAG=true

Breaking changes in 15.0

If you are still on Cypress 14, upgrade to 15.x first. The 15.0.0 release removed Node.js 18 and 23, Linux distributions with glibc older than 2.31, and Chrome DevTools Protocol automation of Firefox (Firefox is automated with WebDriver BiDi only, which sets a minimum Firefox version). It also removed the three-argument form of cy.stub(), webpack 4 support, Vite 4 and Angular 17 for component testing, renamed Cypress.SelectorPlayground to Cypress.ElementSelector, renamed the code property of cy.exec() to exitCode, dropped the direct-download installation and made @cypress/vite-dev-server ESM-only. Cypress 14 had earlier dropped Node.js 16 and macOS older than 11 and removed open-ct and run-ct.

New features from 15 to 16.2

Version Change Documented here Upgrade action

15.4.0

Cypress Studio is available by default (the experimentalStudio flag is no longer needed) and cy.prompt is reserved as a command name behind a feature flag.

Debugging, Studio, Plugins & Reporters

Rename any custom command called prompt.

15.10.0

cy.env() and Cypress.expose() arrive and Cypress.env() is deprecated; allowCypressEnv: false lets you lock the old API out.

Sessions, Authentication & Cross-Origin

Migrate on 15.10 or later, then upgrade to 16.

15.13.0

cy.prompt moves to beta and works without configuration; the experimentalPromptCommand flag is removed. The Cypress Cloud AI features page lists it as generally available, while the command’s API page still said beta at the check date.

AI Features in Cypress & Selenium

Optional; requires a Cypress Cloud account.

15.17.0

Cypress.expose() values can be overridden per suite or test with { expose: { key: value } }.

Core Concepts

Optional.

15.21.0

cypress tap, a command that gives an AI agent direct access to an open-mode Cypress session; cy.exec() deprecated.

Debugging, Studio, Plugins & Reporters, AI Features in Cypress & Selenium

Optional.

16.0.0

HTTP/2 and HTTP/3 in Chrome, Chromium and Edge; faster cy.type() and visibility checks; Angular 22 in component testing.

Getting Started

See the breaking-change table above.

16.1.0

trustedCertificates for self-signed or internal certificates on the native network path.

Sessions, Authentication & Cross-Origin

Use it instead of disabling certificate checks.

16.2.0

The cy.getByRole() query finds elements by ARIA role and optional accessible name, skips elements hidden from the accessibility tree unless { hidden: true } is passed, and also matches role attributes unless { native: false } limits it.

Test Design & Page Objects, Queries, Assertions & Custom Commands

Optional; prefer it over test-id selectors when the role and name are stable.

Third-party packages may lag a Cypress major: at the check date the peer range of cypress-axe 1.7.0 ends at Cypress 15, so installing it next to Cypress 16 needed --legacy-peer-deps; see Accessibility Checks in E2E Tests.

Selenium 4.x

Selenium has no new major version in this window: the 4.x line continues, and the policy is to deprecate for two releases before removing. The table runs from the Selenium Manager releases that changed how drivers and browsers are obtained up to 4.51.0 (9 October 2026).

Version Change Documented here Upgrade action

4.6 and 4.11

Selenium Manager (a Rust command-line tool) ships in every binding from 4.6 and downloads the matching driver. From 4.11 it also uses the Chrome for Testing endpoints to manage chromedriver and the Chrome browser itself, and the current documentation describes it as automated driver and browser management.

Drivers, Browsers & Options, Getting Started

Delete manual driver management and driver-manager libraries; in locked-down CI, pre-populate the cache or point to your own binaries.

4.29

Chrome DevTools Protocol support for Firefox removed after two releases of deprecation; use WebDriver BiDi.

WebDriver BiDi

Replace Firefox CDP code with the BiDi APIs.

4.37

Python 3.9 no longer supported; Python 3.10 or later is needed. Selenium 4.51 adds Python 3.15.

Getting Started

Upgrade the interpreter in CI images and virtual environments.

4.44 to 4.46

.NET assemblies strongly signed (around 4.44); Redis-backed Distributor, SessionMap and SessionQueue for the Grid (4.44 and 4.45); ElectronDriver support (4.45); all BiDi Java classes marked beta (4.46); BiDi creation moves to RemoteWebDriver.

Selenium Grid, WebDriver BiDi

Pin the version when you use BiDi classes in Java, because beta APIs may change.

4.47 to 4.49

A BiDi transport layer for generated modules, subscription parameters for events, removal of FTP proxy support and of a deprecated Grid file-download endpoint, and a prebuilt Selenium Manager for Linux arm64 in every binding.

WebDriver BiDi

Stop using FTP proxy settings.

4.50

Relative locators can be anchored to elements and shadow roots (Java and .NET); deprecated HttpClient interface methods removed; deprecated Firefox profile extension and certificate methods removed from every binding.

Locating & Interacting, Drivers, Browsers & Options

Replace profile-based extension and certificate installation with the supported options or BiDi.

4.51

Java: Guava is no longer a dependency of the client bindings, so ExpectedCondition stops implementing Guava’s Function; RemoteWebDriver.getClientFactory() added; a BiDi code generator. JavaScript: the browser atoms are a standalone @selenium/atoms package and the WebSQL and AppCache atoms are gone.

Waits & Expected Conditions, WebDriver BiDi

Search for com.google.common.base.Function in test code that touches ExpectedCondition and switch to the JDK interface.

4.53 (planned)

The removal of the deprecated HttpCommandExecutor fields was postponed from 4.51 to 4.53 to give users more time.

Drivers, Browsers & Options

Use getClientFactory() and the ClientConfig API instead of the fields.

Only code that explicitly typed a variable, field or parameter as Guava’s Function is affected by the 4.51 change; passing the result of an ExpectedConditions factory straight to WebDriverWait.until() or implementing ExpectedCondition with a lambda compiles unchanged.

// Before 4.51: compiled because ExpectedCondition also extended Guava's Function
// com.google.common.base.Function<WebDriver, WebElement> condition = ExpectedConditions.elementToBeClickable(By.id("submit"));

// 4.51 and later: use the JDK interface (the apply method has the same signature)
java.util.function.Function<WebDriver, WebElement> condition =
    ExpectedConditions.elementToBeClickable(By.id("submit"));

The Java minimum is the part of the Selenium requirements that is easiest to get wrong. Selenium announced in June 2023 that Java 11 is the minimum for the Java bindings and the Grid, because the default HTTP client moved to the JDK’s built-in client. The 4.50 and 4.51 changelogs announce no higher minimum, and this section’s Maven examples compile with --release 11 and ran on JDK 17, but the documentation’s own requirements wording was not re-read for every binding on the check date, so confirm it on the downloads page before moving a Java 11 runtime. The other bindings state their floors in their package metadata: Python 3.10, Ruby 3.3, Node.js 22 and, for .NET, the net462, netstandard2.0 and net8.0 targets.

Selenium also published a documentation page on driving the browser with AI agents (announced in a blog post of 29 September 2026); it is covered in AI Features in Cypress & Selenium. For the Selenium IDE, which has had no release for about two years, and for the Selenium 3 to 4 migration, see Selenium IDE & Legacy.

Services and products that were renamed or retired

The tools are not the only thing that changed. Several services this section mentions have a new name or no longer exist.

Old name What happened Documented here Action

Microsoft Playwright Testing

Retired on 8 March 2026. The successor is Playwright Workspaces in Azure App Testing, generally available.

Cross-Browser Testing, Running in CI/CD

Move cloud-hosted Playwright runs to a Playwright Workspace; check the Azure documentation for the configuration package.

LambdaTest

The company now trades as TestMu AI; its documentation at testmuai.com states "TestMu AI (Formerly LambdaTest)" and the older lambdatest.com documentation address still serves the same text. TestMu AI also became a Selenium development partner.

Cross-Browser Testing, Selenium Grid

Update hub URLs and credentials variable names from the vendor documentation when you renew a plan.

Copilot coding agent

GitHub’s documentation now calls it the Copilot cloud agent (the documentation path is copilot/concepts/agents/cloud-agent).

Agents That Control the Browser

Search for the new name when following current documentation.

ChatGPT Atlas

OpenAI announced on 9 July 2026 that the standalone Atlas browser would stop working on 9 August 2026, with browsing and agent features moving into the ChatGPT desktop app and a Chrome extension. The OpenAI help article returned an access error when fetched, so this relies on the announcement as reported by search.

Agents That Control the Browser

Treat it as history; do not build tests around it.

Operator, ChatGPT agent and Project Mariner

Operator was the earlier OpenAI browser agent and "ChatGPT agent" its successor; no source found on the check date confirms whether the standalone ChatGPT agent was discontinued, so its status is uncertain. The Project Mariner page fetched on the check date contains no retirement wording; it is a research prototype whose capabilities moved to Gemini Computer Use according to the product announcements.

Agents That Control the Browser

Prefer the documented computer-use APIs over consumer browser agents for anything repeatable.

@playwright/experimental-ct-*

The React, React 17, Vue, Svelte and Solid packages are discontinued in favour of the built-in mount() fixture. Svelte was removed in 1.59, React and Vue stop receiving updates after 1.62.1, and Solid and Vue 2 stopped earlier.

Component Testing

Follow the migration path in the component-testing page.

cy.prompt and the Cypress Cloud AI features

The Cypress Cloud AI features page lists cy.prompt, Test Intent Summaries, Error Summaries, AI Skills and the read-only Cloud MCP as generally available, and Studio AI recommendations, the Cloud CLI and cypress tap as beta.

Cypress Cloud, AI Features in Cypress & Selenium

Re-check the release status before relying on a beta feature in CI.

For the security considerations of letting a model operate a browser, which changed as much as the product names, see Securing Browser Agents.

Protractor end of life

Protractor, the Angular team’s former end-to-end test runner built on Selenium, is deprecated: the notice on its npm package says it reached end of life by summer 2023, and its last published version, 7.0.0, dates from May 2020. The Angular CLI no longer generates Protractor tests; ng e2e asks which package to add and offers Playwright, Cypress, Nightwatch, WebdriverIO and Puppeteer schematics. With no maintained release, existing Protractor suites should be migrated rather than patched.

  • To keep the WebDriver model, move to Selenium with explicit waits; see Waits & Expected Conditions.

  • To move to a tool with built-in auto-waiting, see Choosing a Tool, which also links Cypress’s migration guide for Protractor users.

  • Translate page objects first, because they are the largest reusable part of a Protractor suite; see Test Design & Page Objects.

What changed recently

Date Change

13 October 2026

Cypress 16.2.0: the cy.getByRole() query, plus fixes for regressions introduced in 16.0.0 (for example client certificates on the native browser network).

9 October 2026

Selenium 4.51.0 for Java, Python, .NET, Ruby, JavaScript and the Grid: Guava removed from the Java client bindings.

September 2026

Cypress 16.0.0 (1 September) and 16.1.0 (15 September, trustedCertificates); Selenium 4.50.0 (30 September).

At the check date

Playwright 1.64.1 is the latest release on npm and the examples in this section run on it. The next tag is already at 1.65.0-alpha.