Selenium News and Updates: A Smattering of Selenium 91
Selenium 91 is unverified as a release number. Here is the confirmed Selenium 4 timeline, upgrade context, and what developers should check.
Direct answer: “Selenium 91” could not be verified as a Selenium release number in the official materials reviewed for this article. Selenium 4.0.0 was announced on October 13, 2021, and the official downloads page lists Selenium 4.49.0 as the current stable release, dated September 9, 2026 for the client bindings. Release numbers change, so check the official Selenium downloads page before upgrading.
This is a project update and version-context guide, not a claim that Selenium 91 exists. Selenium is a software toolkit for browser automation, with language bindings, server components, and browser extensions—not a consumer hardware product.
1. What “Selenium 91” does—and does not—tell us
The wording in the title is ambiguous. The official Selenium materials cited here do not identify a release called “Selenium 91.” It may refer to an article or update numbered 91, a search phrase, or a mistaken version reference; those interpretations are possibilities, not verified facts.
For a reliable version reference, use the official release and downloads pages. The downloads page distinguishes stable releases from nightly builds. Nightly builds may include bugs or undocumented changes, so use them only when you specifically need changes that have not reached a stable release.
2. The confirmed Selenium release timeline
| Milestone | What the official material says | What developers should take from it |
|---|---|---|
| Selenium 4.0.0 | Announced October 13, 2021, for Java, .NET, Python, Ruby, and JavaScript. | This was the major release transition from Selenium 3. |
| Selenium 4 Alpha 7 for Python | Historical alpha notes record removal of support for Python versions below 3.7, deprecation of desired_capabilities in favor of capabilities, and DevTools API support. |
These are specific historical Python alpha notes, not a complete description of Selenium 4 or a universal current requirement. |
| Selenium 4.49.0 | The downloads page lists this as stable for the five client bindings and Selenium Server/Grid; client bindings show September 9, 2026. | Confirm the current version and release date directly before pinning or upgrading. |
The release archive shows continued 4.x release activity after the 2021 launch. That is why the original major release date and the current stable version answer different questions: one explains when Selenium 4 began; the other identifies the version currently offered as stable.
3. What changed for Selenium 4 adopters
The Selenium 4 announcement described the 3.x-to-4.0.0 transition as intended to be a “drop-in” upgrade, with public APIs kept as stable as possible. That was an upgrade goal, not a guarantee that every existing project would need no changes. Code that depends on deprecated or internal APIs can encounter migration work.
Check these areas before upgrading
- Language binding and runtime: Confirm the Selenium binding version and the runtime version your project supports. Do not apply the historical Python Alpha 7 minimum to every current binding.
- Capabilities: Search for deprecated constructor arguments or APIs in your binding. For the historical Python Alpha 7 note,
desired_capabilitieswas deprecated in favor ofcapabilities; check the current binding documentation for the exact supported call shape. - Internal and deprecated APIs: Search application code and shared test utilities for deprecated interfaces, internal package imports, and wrappers around Selenium internals.
- Browser and driver setup: Verify that your browser, driver management approach, Selenium client, and—if used—Selenium Server/Grid are compatible. The release facts here do not specify a universal browser-driver compatibility matrix; consult the official documentation for your browser and deployment.
- Stable versus nightly: Pin stable versions for routine CI. If evaluating a nightly build, isolate it and expect undocumented changes or bugs.
4. A practical upgrade workflow
- Record the current Selenium binding, language runtime, browser, driver, and Grid/Server versions.
- Read the release notes between your current version and the target version. The official release archive is the source of record for the intervening 4.x releases.
- Update the binding in a branch or isolated environment, keeping dependency changes reviewable.
- Run a representative set of tests across the browsers and execution modes your project supports. Include tests that create sessions, set capabilities, interact with dynamic pages, and clean up sessions.
- Resolve deprecated or internal API use and review any changed browser or server configuration against the relevant official documentation.
- Pin the validated versions in your dependency and CI configuration, then roll out through your usual release process.
This workflow is a general engineering recommendation, not a claim that a specific test suite or version combination was tested for this article.
5. Selenium code and screenshot use cases
Selenium is useful when a test needs to control a real browser: navigate, interact, assert behavior, and capture a result. The following Python example uses Selenium WebDriver to open a page and save a viewport screenshot. Install the Selenium Python package and configure a browser and driver according to the official Selenium documentation before running it.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless")
options.add_argument("--window-size=1440,1000")
driver = webdriver.Chrome(options=options)
try:
driver.get("https://example.com")
driver.save_screenshot("page.png")
finally:
driver.quit()
This captures the current browser viewport. It does not automatically make a full-page capture, remove cookie consent banners, or hide site overlays. Those behaviors require additional browser automation logic or a screenshot service designed to handle them.
Capture a specific element in Python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
try:
driver.get("https://example.com")
card = driver.find_element(By.CSS_SELECTOR, "main")
card.screenshot("main.png")
finally:
driver.quit()
The selector must match an element that exists and is rendered. If the element is below the fold or appears after client-side loading, wait for it before taking the screenshot. Selenium’s official documentation covers language-specific WebDriver APIs and setup: Selenium documentation.
6. When to use browser automation versus a screenshot API
Use Selenium when the task requires browser interaction, application assertions, authentication flows, or custom logic that runs in a browser session. For a straightforward URL-to-image request, a screenshot API can avoid maintaining browser binaries, driver setup, and capture infrastructure.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server for developers. One GET request can return a PNG, JPEG, WebP, or PDF. Its clean-shot flow accepts cookie and consent banners as a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers identify the page verdict and whether the request was billed.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
See the ScreenshotNeo API documentation for parameters and response details. Python:
import requests
r = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={"access_key": "YOUR_API_KEY", "url": "https://example.com"},
timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
Node.js:
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await Bun.write('shot.webp', res);
The API also supports full-page screenshots with lazy images loaded, CSS-selector element capture, dark mode, device presets and custom viewports, retina scale, PDF settings, HTML/CSS rendering, custom CSS and JavaScript, clicks, selector hiding, wait conditions, request and resource blocking, custom headers and cookies, user agents, authorization, timezone and geolocation, transparent backgrounds, image resizing, configurable cache TTLs, signed public image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage reporting, and an OpenAPI spec. Other screenshot API parameter names also work to ease migrations. An MCP server exposes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.
Plans are Free at 1,000 screenshots per month with no card, Starter at $5 for 3,000, Growth at $15 for 15,000, Pro at $39 for 60,000, Scale at $99 for 250,000, and Business at $249 for 1,000,000. Yearly billing gives two months free; every feature is on every plan. Cookie banners, popups, and chat widgets are removed before the shot; bot checks, blank pages, and failed loads are never billed; an MCP server lets AI agents take screenshots; and 1,000 screenshots a month are free with no card, with paid plans starting at $5 for 3,000. Sign up free for ScreenshotNeo.
7. Reliability, performance, and cost considerations
- Browser automation: A browser session gives control over interactions, but adds browser startup, driver compatibility, and cleanup responsibilities. Reuse a session for related steps where appropriate, wait on meaningful page conditions, and always close the driver in a
finallyblock. - Flaky pages: Fixed sleeps can be too short on a slow run and waste time on a fast one. Prefer waiting for the specific element or state needed by the test.
- Screenshot API: A single request is simpler for URL captures. Use request timeouts, check HTTP status and response headers, and distinguish page verdicts from transport failures. Async jobs, webhooks, caching, and bulk capture can fit larger workflows.
- Cost: Selenium itself is open-source software; operational cost depends on the machines, browser sessions, and infrastructure you run. ScreenshotNeo’s listed plan limits and prices provide a direct per-volume comparison; only clean shots are billed according to the product facts above.
8. Troubleshooting Selenium upgrades and screenshots
| Symptom | Likely cause | What to check |
|---|---|---|
| Import or method errors after upgrading | Code uses a deprecated or internal API, or binding-specific APIs changed. | Review the release notes for every skipped version and replace deprecated calls with the current documented API. |
| Session fails to start | Browser, driver, Selenium client, or Grid configuration mismatch. | Check each version and the browser-specific Selenium guidance; inspect the full driver/server error. |
| Screenshot is blank or incomplete | Capture occurred before navigation or client-side rendering finished, or the target is outside the viewport. | Wait for a meaningful element/state, scroll if needed, and verify whether you need viewport or full-page capture. |
| Element screenshot cannot find selector | Selector is wrong, element is delayed, or it is inside a frame or shadow root. | Confirm the selector in the page, wait for presence/visibility, and switch to the relevant browsing context. |
| Tests pass locally but fail in CI | Different browser/runtime versions, slower resources, or environment-specific configuration. | Pin dependencies, align browser setup, and replace timing assumptions with explicit waits. |
| Nightly build behaves unexpectedly | Nightly releases may contain bugs or undocumented changes. | Reproduce on a stable build and use nightly only when investigating unreleased changes. |
| Screenshot API returns an error or unexpected page | Invalid key or parameters, target restrictions, timeout, bot check, or failed page load. | Check HTTP status, response headers including page verdict and billed status, request URL encoding, and the API docs. |
9. Frequently asked questions
Is Selenium 91 the same as Selenium 4.9.1?
The research reviewed does not establish that interpretation. Treat “Selenium 91” as unverified and use the official version and release pages for exact version numbers.
Does Selenium 4 require Python 3.7 or newer?
The cited Python 3.7 note is from the historical Alpha 7 changelog. Check the current Python binding’s supported runtime requirements rather than treating that alpha note as current guidance.
Should I use a nightly Selenium build?
Use a stable build for routine development and CI unless you need to evaluate an unreleased change. The official downloads page warns that nightly builds can include bugs or undocumented changes.
Can Selenium replace a screenshot API?
It can capture screenshots as part of browser automation. A screenshot API is often simpler when the requirement is only to turn URLs into image or PDF files, especially at batch scale.
Sources
- Selenium Project: Announcing Selenium 4 — October 13, 2021 launch, supported bindings, and upgrade framing.
- Selenium Project: Downloads — stable and nightly builds and current version listing.
- Selenium Project: Release archive — subsequent release activity.
- SeleniumHQ Python changelog — historical Alpha 7 notes.
- Selenium Project — project overview.


