Selenium 4.49 Changes BiDi and Grid: Validate Proxy Browser Fleets Before Rollout

A woven Internet browser grid connects through ceramic proxy gateways with bidirectional event streams

The Selenium project released Selenium 4.49 on September 9, 2026 for JavaScript, Ruby, Python, .NET, Java and Grid. Several changes matter to teams that run browser automation through authenticated proxies: .NET fixes include a mismatched BiDi proxy JSON property name; Python now raises typed WebDriver errors for BiDi wire error codes and runs its BiDi suite against Grid; Grid fixes a 500 error when downloading files whose names contain spaces; Docker Selenium changes its Kubernetes liveness probe to a TCP socket and replaces an external-scaler strategy with one that includes ongoing sessions.

These release notes do not claim a general proxy performance improvement. They do identify seams where an upgrade can change configuration serialization, error classification, node health and session placement. A controlled canary is safer than upgrading every proxy-backed worker at once.

Why the BiDi proxy-field fix deserves a regression test

WebDriver BiDi sends structured commands and events between the client and browser. A property-name mismatch can cause a binding to serialize or deserialize a field differently from the shared protocol schema. The release notes specifically mention a corrected .NET proxy property name alongside other DTO fixes.

If your .NET tests create sessions with proxy capabilities, verify the effective session configuration rather than assuming that a successful session means the requested proxy was applied. A browser may start while using a direct route, the wrong proxy mode or incomplete credentials.

Capture a sanitized session manifest:

test_id
binding_and_version
browser_and_version
grid_node_alias
requested_proxy_mode
route_alias
requested_market
observed_market
address_family
bidi_enabled
session_created_at

Never include proxy passwords, tokens or raw cookies in the manifest.

Build a direct-and-proxy canary matrix

Use an origin you control or are explicitly authorized to test. Run the same deterministic workflow in the old and candidate Selenium builds:

PathSession typePurpose
Direct controlClassic WebDriverDetect browser or application regressions unrelated to the proxy
Proxy controlClassic WebDriverVerify authentication, route and page correctness
Direct BiDiBiDi-enabledIsolate protocol event and error changes
Proxy BiDiBiDi-enabledVerify capabilities, events and the effective proxy route together
Grid proxyRemote sessionValidate node selection, capacity and artifact handling

Keep browser build, viewport, locale, timezone, fixture, timeout, retry policy and network conditions stable. Change one variable per comparison.

Prove the route inside the browser session

Do not validate the route only from the machine that launches Selenium. The Grid node and browser may run in another container or host. From inside each browser session, request a small authorized endpoint that returns the observed source region and a random challenge generated for that test.

Record the challenge match, observed market, address family, response digest and timestamp. Then load a second deterministic page and verify a semantic marker. This distinguishes “the browser used the intended route” from “a preflight request outside the browser used the intended route.”

For rotating services, define whether every request may change exit. For sticky sessions, verify that the same route alias remains within the permitted window and separates correctly across independent sessions. The residential proxy session stickiness test provides a deeper method.

Assert BiDi events and typed failures

Python’s new typed BiDi wire errors can change exception handling. Test at least one expected success and several controlled failures:

  • invalid command or argument;
  • navigation timeout;
  • closed browsing context;
  • proxy authentication rejection;
  • unreachable proxy gateway;
  • destination connection failure after a tunnel is established.

Your application should preserve the original failure phase. Do not collapse all of them into a generic retryable network error. Authentication and policy failures should normally stop quickly; transient transport failures may enter a bounded retry policy.

For event-driven collectors, confirm that navigation, network and log events remain associated with the correct session and browsing context. A duplicate, missing or late event must not create a duplicate business record.

Test Grid downloads with realistic filenames

Selenium 4.49 fixes a Grid 500 error for downloads whose filenames contain spaces, and Java removes a deprecated file-download endpoint. If your verification or research workflow saves reports, screenshots or exported data, test filenames with spaces, Unicode, long extensions and repeated names.

Validate more than the HTTP status:

  1. the artifact belongs to the correct session;
  2. the filename is normalized as expected;
  3. the byte length and digest match the controlled fixture;
  4. temporary files are deleted under policy;
  5. one session cannot retrieve another session’s artifact;
  6. clients do not depend on the removed deprecated Java endpoint.

Avoid using real customer exports during the canary.

Recheck container health and scaling

Docker Selenium’s liveness probe change from an HTTP readiness path to a TCP socket alters what Kubernetes considers “alive.” A listening socket can prove that a service accepts connections, but not that it can create a browser session, reach the proxy gateway or complete a page.

Keep liveness, readiness and synthetic availability separate:

  • liveness answers whether the process should be restarted;
  • readiness answers whether the node should receive new sessions;
  • synthetic availability answers whether an authorized browser can complete a useful direct or proxy workflow.

The scaling change that includes ongoing sessions also deserves observation. During scale-down, confirm active sessions are not stranded, proxy credentials are not reassigned to a different tenant, and downloads complete before node termination. Measure queued sessions, active sessions, session-creation latency, node drain duration and forced terminations.

Watch connection and identity boundaries

A proxy-backed browser grid has three identities: client, Grid session and proxy session. Preserve the mapping for the lifetime of the workflow. Pooling or retry logic must not move cookies, authorization headers, proxy credentials or sticky identifiers into another tenant’s session.

Run two synthetic tenants in parallel with distinct route aliases and canary markers. Verify that each sees only its own artifacts and events. This is a correctness and privacy test, not a load test.

Use the proxy request-header integrity test to check that the browser and proxy path do not add or lose sensitive headers unexpectedly.

Define rollout gates

Promote Selenium 4.49 only when the candidate matches the control on:

  • effective proxy route and requested market;
  • session creation and clean shutdown;
  • BiDi event completeness and typed error handling;
  • proxy authentication failure classification;
  • download ownership, filename and digest;
  • node readiness and drain behavior;
  • useful-result rate, p95 duration and retries per useful result;
  • absence of cross-session credentials, cookies, events or artifacts.

Roll out to a small worker group and one low-risk route class first. Pause automatically when a correctness gate fails. Do not hide a failure by increasing retries or rotating until an acceptable result appears.

Release checklist

  • [ ] Old and candidate Selenium versions use the same browser and fixture.
  • [ ] Direct, proxy, classic WebDriver and BiDi paths are compared.
  • [ ] The route is verified from inside the browser session.
  • [ ] .NET proxy capabilities match the effective session.
  • [ ] Python typed BiDi errors map to the correct retry policy.
  • [ ] Events remain attached to the correct context and record.
  • [ ] Downloads with spaces and Unicode pass ownership and digest checks.
  • [ ] Deprecated Java download calls are absent.
  • [ ] Liveness, readiness and useful-workflow probes are separate.
  • [ ] Active sessions drain safely during scale-down.
  • [ ] Synthetic tenants cannot cross credentials, events or artifacts.
  • [ ] Logs and screenshots exclude secrets and personal data.
  • [ ] Rollback is rehearsed and fast.

FAQ

Does Selenium 4.49 improve proxy speed?

The release announcement does not make that claim. Its relevant changes concern protocol fields, errors, Grid downloads, build infrastructure and container operation. Measure your own useful-result latency.

Is a successful session enough to prove the proxy works?

No. Verify the route and market from inside the browser, then verify page semantics. A session can start with a different network path than intended.

Should every BiDi error be retried?

No. Preserve the error type and failure phase. Invalid configuration, authentication and policy errors are usually not repaired by retrying.

Does a TCP liveness probe replace an end-to-end check?

No. It answers a narrower process-health question. Keep a separate readiness check and a low-volume synthetic browser workflow.

Can the canary use public sites?

Prefer controlled origins. If a third-party destination is necessary, obtain authorization, keep volume low and follow its terms and rate limits.

Compliance and safe operation

Run browser automation and proxies only on accounts, systems and destinations you are authorized to test. Respect access controls, privacy requirements, robots directives where applicable, platform terms and rate limits. Do not use rotation to evade blocks, bypass challenges or conceal prohibited activity. Protect proxy credentials and minimize retained evidence.

Source note: Selenium Project, “Selenium 4.49 Released!”, published September 9, 2026 and last modified September 10, 2026; Selenium Project release notes for version 4.49.

Continue with the proxy response integrity test before widening the canary.