Why Selenium is still relevant in 2026
Three durable reasons to pick Selenium:
- Safari support. Playwright's WebKit isn't Safari — it's the WebKit engine without Safari's shell. Real Safari testing or scraping requires Selenium + safaridriver.
- Mobile browsers. Appium (the mobile sibling of Selenium) drives mobile Chrome, mobile Safari, and native apps through the same WebDriver API. No other framework reaches this surface.
- Existing test code. Half of QA automation in the enterprise is Selenium. If your team maintains a test suite, reusing the framework for scraping is faster than rewriting.
For greenfield Python or Node Chromium scraping, Playwright is the better pick — modern API, faster startup, better parallelism. Selenium's WebDriver wire protocol adds a millisecond-per-command overhead that adds up over a long script.
Selenium's detection surface
Selenium is the most-detected of the three big browser-automation frameworks because:
- WebDriver is W3C-standardised to set
navigator.webdriver = true. Every Selenium browser exposes this by default. Anti-bot scripts test it as the first line of detection. - Selenium injects identifying properties into
window—window.cdc_*keys,window.$cdc_*, others — that anti-bot scripts grep for. - The WebDriver wire protocol leaves timing artifacts — command/response latency that differs from real user input by a measurable margin.
- The chromedriver binary itself has shipped with the substring "$cdc_" in its source for years (only recently patched in mainline).
Vanilla Selenium gets blocked on any modern protected site. The fixes are the stealth variants in the next section.
undetected-chromedriver and SeleniumBase UC mode
Two production stealth approaches for Selenium:
- undetected-chromedriver (UC) — patches the chromedriver binary on download to remove the
$cdc_strings and overridesnavigator.webdriver. Defeats most Layer-1 and Layer-2 checks. Loses to Function.toString() inspection because the override is a JS function. - SeleniumBase UC mode — wraps undetected-chromedriver with a pytest-friendly API, adds Cloudflare-Turnstile auto-click, and exposes a clean
sb.uc_*method set. The default choice when you want Selenium plus stealth plus a test framework. - selenium-driverless — drops the WebDriver layer entirely and drives Chrome via raw CDP, eliminating the WebDriver fingerprint at the cost of the cross-browser support that made you pick Selenium in the first place.
Even with UC, Selenium loses to Kasada, F5 Shape, and recent Akamai. For those, switch to Camoufox, CloakBrowser, or a managed API — the WebDriver protocol itself is the bottleneck.
