Selenium Trunk This Week: Bazel Test Gating, Grid Redis Bundle, and Atoms Migration
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 keysessions.scheme) sets the URI scheme, for exampleredisorhttp.--sessions-implementation(config keysessions.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:
[js] Use the typescript atom for get attribute[java] Move Java bindings to use Typescript atoms for isShown, getAttribute[rb] Move atoms to use the typescript versions[dotnet] Move .NET bindings to use new Typescript atoms for isShown, getAttribute
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:
- Do not send browser_version to local driver when browser is pinned
- When browser path is specified, browser version should not get sent to the driver
- Selenium Manager does not clear browser version when binary specified
- Allow running beta versions on grid by passing stereotype
- Rescue grid connection errors during test example cleanup
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:
- Java skips browser restricted ports when picking a free port. The Java port picker now avoids ports that browsers refuse to connect to. If you have seen random WebDriver failures with no obvious cause, this is one possible explanation.
- Python marks Safari tests broken by SafariDriver 26.5 as xfail. SafariDriver 26.5 changed behavior the python bindings did not like. This is a marker, not a fix.
- Surface Bazel cache failures with diagnostics and graceful fallback. Silent remote cache errors now produce diagnostics and the build continues without the cache.
- Prevent
byte-buddyjdkN variant from being picked by dependency updates.byte-buddypublishes JDK specific artifacts; renovate was grabbing them. Worth copying if you run renovate on a JVM repo.
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.