Selenium Trunk This Week: Bazel Test Gating, Grid Redis Bundle, and Atoms Migration

   |   5 minute read   |   Using 929 words

Selenium trunk took 71 commits in the past week. The activity falls into four themes plus a pile of smaller fixes: a build refactor that switches IE and Safari test gating to bazel’s target_compatible_with, a Grid default flip that bundles the Redis backed SessionMap, a cross language move of internal atoms to TypeScript, and a long stream of Ruby binding cleanups around pinned browsers. If you build Selenium from source or operate Selenium Grid, this week is worth a look. Full repo: SeleniumHQ/selenium on GitHub.

Bazel test gating now uses target_compatible_with

The headline build change is Use target_compatible_with to gate IE/Safari tests. For years, IE and Safari test targets carried a skip-rbe tag and a default selenium.skiptest=false JVM flag to dodge unsupported hosts. The new approach is cleaner: bazel native platform constraints. IE targets now use target_compatible_with = ["@platforms//os:windows"] and Safari uses ["@platforms//os:macos"]. The skip-rbe tag is gone from those rules and the selenium.skiptest JVM flag plumbing is removed from java/browsers.bzl.

This pairs with do not create targets for IE for browser tests, which stops generating IE specific targets in the browser test matrix entirely.

What changes in practice:

  • On Linux RBE, IE and Safari targets become incompatible at analysis time instead of being filtered later by tag. Bazel skips them earlier and the logs say so plainly.
  • Local developers on macOS or Windows still get the platform appropriate targets without manual flag tweaks.

If you maintain a downstream Selenium build pipeline, expect cleaner analysis logs and slightly faster bazel test //... runs on hosts that lack IE or Safari.

Grid: Redis SessionMap is now bundled

Operators of Selenium Grid get the most visible operator facing change this week. Bundle the Redis backed SessionMap by default folds RedisBackedSessionMap into the main selenium.jar. Previously you had to pull the session map jar via --ext $(coursier fetch ...) to get it on the classpath. That dance is over.

The PR also adds two new CLI flags on the sessions subcommand:

  • --sessions-scheme (config key sessions.scheme) sets the URI scheme, for example redis or http.
  • --sessions-implementation (config key sessions.implementation) picks the full classname of a non default session map implementation.

The new invocation is short:

java -jar selenium.jar sessions \
  --sessions-implementation org.openqa.selenium.grid.sessionmap.redis.RedisBackedSessionMap \
  --sessions-scheme redis \
  --sessions-host "<redis_host>" \
  --sessions-port <redis_port>

The old env var style (SESSIONS_IMPLEMENTATION=, SESSIONS_SCHEME=) still works. If your production grid depends on --ext to load the Redis session map, drop that flag and switch to the new options.

TypeScript atoms land in four language bindings

Selenium has been rewriting its internal “atoms” (small JS snippets injected into pages) in TypeScript. This week four language bindings switched to consuming the new compiled output:

For users this is invisible. For people who build Selenium from source it changes the BUILD.bazel graph under each language’s atoms directory and changes which JS file ends up shipped inside the bindings. If you keep local patches against the legacy atom sources, rebase them against the TypeScript output now rather than later. More atoms remain in JS only form; expect a slow steady stream of similar cross language switches.

Ruby bindings: browser version and pinned binary cleanup

The Ruby tree saw the most commits, most of them around how browser_version, the browser binary path, and Selenium Manager interact. The big policy change is deprecate Chromium Profile classes. If your Ruby tests construct a Chromium Profile object directly, plan a migration.

The rest is a coherent set of fixes for the case where a user pins a specific browser:

If you have ever pinned binary and then watched the driver complain about a missing or mismatched browser version, that whole class of bug is the target. The fixes mostly live in rb/lib/selenium/webdriver/common/driver_finder.rb and rb/lib/selenium/webdriver/chromium/options.rb.

Smaller fixes worth knowing

A few one off changes solve real footguns:

The renovate config itself got touched 13 times in 7 days, mostly tightening which packages renovate may bump.

What to watch

  • Chromium Profile deprecation in Ruby. No removal date is set, but a deprecation landing in May 2026 usually means removal in a couple of minor releases. Migrate now.
  • SafariDriver 26.5. The python xfail is provisional. Either a Selenium side fix or a SafariDriver patch upstream should follow.
  • The TypeScript atoms migration is incremental. Expect more bindings to flip from legacy JS atoms to the compiled TS output in the coming weeks.


denis256 at denis256.dev