Skip to content

Technical blog post for Selenium Grid 4.41.0#2591

Merged
VietND96 merged 2 commits intotrunkfrom
grid-4.41.0-blog
Feb 26, 2026
Merged

Technical blog post for Selenium Grid 4.41.0#2591
VietND96 merged 2 commits intotrunkfrom
grid-4.41.0-blog

Conversation

@VietND96
Copy link
Member

@VietND96 VietND96 commented Feb 24, 2026

User description

Thanks for contributing to the Selenium site and documentation!
A PR well described will help maintainers to review and merge it quickly

Before submitting your PR, please check our contributing guidelines.
Avoid large PRs, and help reviewers by making them as simple and short as possible.

Description

Technical blog post for Selenium Grid 4.41.0

Motivation and Context

Types of changes

  • Change to the site (I have double-checked the Netlify deployment, and my changes look good)
  • Code example added (and I also added the example to all translated languages)
  • Improved translation
  • Added new translation (and I also added a notice to each document missing translation)

Checklist

  • I have read the contributing document.
  • I have used hugo to render the site/docs locally and I am sure it works.

PR Type

Documentation


Description

  • Comprehensive blog post documenting Selenium Grid 4.41.0 release features

  • Covers Dynamic Grid for Kubernetes, Session Event API, and event-driven video recording

  • Details Distributor reliability fixes, Traefik ingress migration, and browser version matrix

  • Includes upgrade instructions and references to all related PRs and commits


Diagram Walkthrough

flowchart LR
  A["Selenium Grid 4.41.0"] --> B["Dynamic Grid<br/>Kubernetes"]
  A --> C["Session Event API"]
  A --> D["Event-Driven<br/>Video Recording"]
  A --> E["Traefik Ingress<br/>Migration"]
  A --> F["Distributor<br/>Reliability Fixes"]
  A --> G["Browser Version<br/>Matrix"]
  B --> B1["KubernetesSessionFactory"]
  B --> B2["NodeKubernetes Image"]
  C --> C1["Client-to-Grid Events"]
  C --> C2["ZeroMQ Sidecar"]
  D --> D1["Session Lifecycle Tracking"]
  D --> D2["Failure-Only Upload"]
  F --> F1["Thread Exhaustion Fix"]
  F --> F2["WebSocket Leak Fix"]
  F --> F3["Deadlock Prevention"]
Loading

File Walkthrough

Relevant files
Documentation
selenium-grid-4-41-deep-dive.md
Selenium Grid 4.41.0 release announcement and technical deep dive

website_and_docs/content/blog/2026/selenium-grid-4-41-deep-dive.md

  • New comprehensive blog post documenting Selenium Grid 4.41.0 release
    highlights
  • Detailed explanation of Dynamic Grid native Kubernetes support with
    KubernetesSessionFactory
  • Session Event API documentation with multi-language client examples
    and ZeroMQ sidecar consumption
  • Event-driven video recording improvements and selective upload based
    on test failure status
  • Traefik ingress controller migration guide replacing deprecated
    Ingress NGINX
  • Distributor reliability fixes addressing thread exhaustion, WebSocket
    leaks, and deadlock scenarios
  • Browser version matrix overview with 167+ image variants and
    interactive debugging features
  • Upgrade instructions for Docker Compose, Helm, and standalone JAR
    deployments
  • Complete reference table of all related PRs and commits across
    Selenium and docker-selenium repositories
+625/-0 

@qodo-code-review
Copy link
Contributor

qodo-code-review bot commented Feb 24, 2026

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
Event bus exposure

Description: The post encourages exposing the ZeroMQ event bus on all interfaces via --publish-events
"tcp://:4442" and --subscribe-events "tcp://:4443", which could enable unauthorized
event subscription/injection if those ports are reachable outside a trusted network
segment (no auth/TLS is mentioned).
selenium-grid-4-41-deep-dive.md [291-301]

Referred Code
This is not limited to Hub+Node setups. **Standalone** can expose the same publish and subscribe ports so any sidecar can tap into the event bus alongside it:

```bash
java -jar selenium-server.jar standalone \
  --bind-bus true \
  --events-implementation "org.openqa.selenium.events.zeromq.ZeroMqEventBus" \
  --publish-events "tcp://*:4442" \
  --subscribe-events "tcp://*:4443"

With --bind-bus true, Standalone starts its own ZeroMQ event bus and exposes it on the configured ports — the same ports your sidecar would connect to for subscriptions. This makes it straightforward to build any sidecar that reacts to lifecycle events and custom test signals through a single subscription, regardless of whether you are running a full Grid cluster or a single Standalone container.


</details></details></td></tr>
<tr><td colspan='2'><strong>Ticket Compliance</strong></td></tr>
<tr><td>⚪</td><td><details><summary>🎫 <strong>No ticket provided </strong></summary>


- [ ] Create ticket/issue <!-- /create_ticket --create_ticket=true -->

</details></td></tr>
<tr><td colspan='2'><strong>Codebase Duplication Compliance</strong></td></tr>
<tr><td>⚪</td><td><details><summary><strong>Codebase context is not defined </strong></summary>


Follow the <a href='https://qodo-merge-docs.qodo.ai/core-abilities/rag_context_enrichment/'>guide</a> to enable codebase context checks.

</details></td></tr>
<tr><td colspan='2'><strong>Custom Compliance</strong></td></tr>
<tr><td rowspan=6>🟢</td><td>
<details><summary><strong>Generic: Comprehensive Audit Trails</strong></summary><br>

**Objective:** To create a detailed and reliable record of critical system actions for security analysis <br>and compliance.<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Meaningful Naming and Self-Documenting Code</strong></summary><br>

**Objective:** Ensure all identifiers clearly express their purpose and intent, making code <br>self-documenting<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Robust Error Handling and Edge Case Management</strong></summary><br>

**Objective:** Ensure comprehensive error handling that provides meaningful context and graceful <br>degradation<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Secure Error Handling</strong></summary><br>

**Objective:** To prevent the leakage of sensitive system information through error messages while <br>providing sufficient detail for internal debugging.<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Secure Logging Practices</strong></summary><br>

**Objective:** To ensure logs are useful for debugging and auditing without exposing sensitive <br>information like PII, PHI, or cardholder data.<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Security-First Input Validation and Data Handling</strong></summary><br>

**Objective:** Ensure all data inputs are validated, sanitized, and handled securely to prevent <br>vulnerabilities<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>

<tr><td align="center" colspan="2">

- [ ] Update <!-- /compliance --update_compliance=true -->

</td></tr></tbody></table>
<details><summary>Compliance status legend</summary>
🟢 - Fully Compliant<br>
🟡 - Partial Compliant<br>
🔴 - Not Compliant<br>
⚪ - Requires Further Human Verification<br>
🏷️ - Compliance label<br>
</details>

@github-actions
Copy link
Contributor

Images automagically compressed by Calibre's image-actions

Compression reduced images by 78.2%, saving 1.6 MB.

Filename Before After Improvement Visual comparison
website_and_docs/static/images/blog/2026/selenium-grid-4-41-deep-dive.jpg 2.1 MB 459.9 KB 78.2% View diff

@qodo-code-review
Copy link
Contributor

qodo-code-review bot commented Feb 24, 2026

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
Pin dependency and image versions

Pin the dependency version in the coursier fetch command to 4.41.0 and update
the browser image tags from :latest to the specific 4.41.0-20260222 version to
ensure the example is reproducible.

website_and_docs/content/blog/2026/selenium-grid-4-41-deep-dive.md [542-548]

 # Node with Dynamic Grid on Kubernetes (image mode)
 java -jar selenium-server.jar \
-  --ext $(coursier fetch -p org.seleniumhq.selenium:selenium-node-kubernetes:latest.release) \
+  --ext $(coursier fetch -p org.seleniumhq.selenium:selenium-node-kubernetes:4.41.0) \
   node \
-  -K selenium/standalone-chrome:latest '{"browserName": "chrome"}' \
-  -K selenium/standalone-firefox:latest '{"browserName": "firefox"}' \
-  -K selenium/standalone-edge:latest '{"browserName": "MicrosoftEdge"}'
+  -K selenium/standalone-chrome:4.41.0-20260222 '{"browserName": "chrome"}' \
+  -K selenium/standalone-firefox:4.41.0-20260222 '{"browserName": "firefox"}' \
+  -K selenium/standalone-edge:4.41.0-20260222 '{"browserName": "MicrosoftEdge"}'

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies that using latest for dependencies and images in a version-specific blog post undermines reproducibility. Pinning versions to 4.41.0 and its corresponding image tags significantly improves the long-term accuracy and usefulness of the documentation.

Medium
Clarify ConfigMap key usage

Clarify that when using configmap:, the key in the ConfigMap must match the
provided , not a fixed value like template, to avoid user confusion.

website_and_docs/content/blog/2026/selenium-grid-4-41-deep-dive.md [560]

-Noted: The ConfigMap should be deployed to cluster and must contain a key named `template` whose value is a valid K8s Job YAML. The Job must have a container named `browser` with an image. Cross-namespace references use `namespace/configmap-name`.
+Note: When using `configmap:<name>`, the ConfigMap must be deployed to the cluster and contain a key matching `<name>` (e.g., `my-chrome-template`). The value of this key must be a valid Kubernetes Job YAML. The Job must define a container named `browser` with an image. Cross-namespace references can be made using `namespace/configmap-name`.
  • Apply / Chat
Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies a potential point of confusion in the documentation regarding ConfigMap key naming. The proposed change clarifies that the key name is dynamic and corresponds to the command-line argument, which improves the accuracy and clarity of the instructions.

Low
Possible issue
Fix broken commit link
Suggestion Impact:The commit did not correct the hash to `a9473df`, but it removed the entire "Commit" column (and thus the broken commit link) from the references table, eliminating the issue indirectly.

code diff:

@@ -598,29 +593,29 @@
 
 ### Selenium Core (selenium-4.41.0)
 
-| PR | Commit | Description |
-|---|---|---|
-| [#17015](https://github.com/SeleniumHQ/selenium/pull/17015) | [`0d3c440`](https://github.com/SeleniumHQ/selenium/commit/0d3c44026343785cc651e1218b0545731476efe5) | Add session event API for server-side event bus integration |
-| [#17022](https://github.com/SeleniumHQ/selenium/pull/17022) | [`a47041a`](https://github.com/SeleniumHQ/selenium/commit/a47041a5398c7465bc52cac66e3e7d198c5befb5) | Preventing potential deadlock in Distributor |
-| [#17060](https://github.com/SeleniumHQ/selenium/pull/17060) | [`a9473df`](https://github.com/SeleniumHQ/selenium/commit/a9473df96d) | Revert default standalone config |
-| [#17072](https://github.com/SeleniumHQ/selenium/pull/17072) | [`7278252`](https://github.com/SeleniumHQ/selenium/commit/7278252badc14d9d036df8ca20d6927b5f546a49) | Dynamic Grid standalone support passing basic auth credential |
-| [#17092](https://github.com/SeleniumHQ/selenium/pull/17092) | [`1f51b2b`](https://github.com/SeleniumHQ/selenium/commit/1f51b2b20fd08cefa3cb186211dae22f6997076b) | Support Dynamic Grid in Kubernetes cluster |
-| [#17097](https://github.com/SeleniumHQ/selenium/pull/17097) | [`ac74b7e`](https://github.com/SeleniumHQ/selenium/commit/ac74b7e263e1308c3f5f8c666c8c2cb97da3e417) | Restore stereotype capabilities merging in RelaySessionFactory |
-| [#17104](https://github.com/SeleniumHQ/selenium/pull/17104) | [`d8195c8`](https://github.com/SeleniumHQ/selenium/commit/d8195c8aa617c54d191523a5210f972978965b93) | Fix Distributor thread exhaustion in node health-check cycle |
-| [#17106](https://github.com/SeleniumHQ/selenium/pull/17106) | [`741fe01`](https://github.com/SeleniumHQ/selenium/commit/741fe01d276aa67a44b4a6c3590c060fd47d4f2f) | Fix WebSocket connection counter leaks in ProxyNodeWebsockets |
-| [#17109](https://github.com/SeleniumHQ/selenium/pull/17109) | [`527a40b`](https://github.com/SeleniumHQ/selenium/commit/527a40b30f01b272c1b7df1de122f8b16e3f79ce) | Distributor retry session when RemoteNode executor shutting down |
+| PR | Description |
+|---|---|
+| [#17015](https://github.com/SeleniumHQ/selenium/pull/17015) | Add session event API for server-side event bus integration |
+| [#17022](https://github.com/SeleniumHQ/selenium/pull/17022) | Preventing potential deadlock in Distributor |
+| [#17060](https://github.com/SeleniumHQ/selenium/pull/17060) | Revert default standalone config |
+| [#17072](https://github.com/SeleniumHQ/selenium/pull/17072) | Dynamic Grid standalone support passing basic auth credential |
+| [#17092](https://github.com/SeleniumHQ/selenium/pull/17092) | Support Dynamic Grid in Kubernetes cluster |
+| [#17097](https://github.com/SeleniumHQ/selenium/pull/17097) | Restore stereotype capabilities merging in RelaySessionFactory |
+| [#17104](https://github.com/SeleniumHQ/selenium/pull/17104) | Fix Distributor thread exhaustion in node health-check cycle |
+| [#17106](https://github.com/SeleniumHQ/selenium/pull/17106) | Fix WebSocket connection counter leaks in ProxyNodeWebsockets |
+| [#17109](https://github.com/SeleniumHQ/selenium/pull/17109) | Distributor retry session when RemoteNode executor shutting down |
 

Correct the truncated commit hash a9473df96d to the valid short hash a9473df to
fix the broken link in the references table.

website_and_docs/content/blog/2026/selenium-grid-4-41-deep-dive.md [605]

-| [#17060](https://github.com/SeleniumHQ/selenium/pull/17060) | [`a9473df`](https://github.com/SeleniumHQ/selenium/commit/a9473df96d) | Revert default standalone config |
+| [#17060](https://github.com/SeleniumHQ/selenium/pull/17060) | [`a9473df`](https://github.com/SeleniumHQ/selenium/commit/a9473df) | Revert default standalone config |

[Suggestion processed]

Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies and fixes a broken link to a commit hash in the references table. This is a useful correction that improves the quality and usability of the documentation for readers wanting to explore the source code changes.

Low
  • Update

@netlify
Copy link

netlify bot commented Feb 24, 2026

Deploy Preview for selenium-dev ready!

Name Link
🔨 Latest commit cfbb7ec
🔍 Latest deploy log https://app.netlify.com/projects/selenium-dev/deploys/699ded58576dbc000857afb9
😎 Deploy Preview https://deploy-preview-2591--selenium-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify
Copy link

netlify bot commented Feb 24, 2026

Deploy Preview for selenium-dev ready!

Name Link
🔨 Latest commit db799bf
🔍 Latest deploy log https://app.netlify.com/projects/selenium-dev/deploys/69a09173ff84d70008134f06
😎 Deploy Preview https://deploy-preview-2591--selenium-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@VietND96 VietND96 force-pushed the grid-4.41.0-blog branch 2 times, most recently from 364992f to 30fcd68 Compare February 24, 2026 18:52
@VietND96 VietND96 changed the title Blog post Grid 4.41.0 Technical blog post for Selenium Grid 4.41.0 Feb 24, 2026
Signed-off-by: Viet Nguyen Duc <nguyenducviet4496@gmail.com>
Copy link
Member

@diemol diemol left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small comment, everything else looks fine.

Is this also part of the docs now?

Signed-off-by: Viet Nguyen Duc <nguyenducviet4496@gmail.com>
@VietND96 VietND96 merged commit fa54217 into trunk Feb 26, 2026
7 checks passed
@VietND96 VietND96 deleted the grid-4.41.0-blog branch February 26, 2026 18:42
selenium-ci added a commit that referenced this pull request Feb 26, 2026
* Technical blog post for Selenium Grid 4.41.0
* SPI stands for Service Provider Interface

[deploy site]

---------

Signed-off-by: Viet Nguyen Duc <nguyenducviet4496@gmail.com> fa54217
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants