How to use SeleniumBase UC mode
Proxy Compare read six browser signals under SeleniumBase 4.52.4 with uc=True and again with it off, on Chrome 151 and Python 3.14.7 on 27 Aug 2026, and timed both launches. UC mode is the only tool in the comparison with a clean user agent.
3 Sept 2026 · 5 min read
Point in time. The figures below were read on 27 Aug 2026 and are not updated after publication. For current numbers see the comparison table.

What is SeleniumBase UC mode?
SeleniumBase is a Python test framework built on top of Selenium. It wraps WebDriver in a much shorter API, and it bundles a set of things Selenium makes you assemble yourself: driver management, waits, and a stealth driver.
UC mode is that stealth driver, and the name is inherited from undetected-chromedriver, whose approach it follows. Instead of driving a bundled Chromium the way Playwright does, it patches ChromeDriver and drives the Chrome you already have installed, which removes a whole class of differences between your browser and a real one rather than papering over them afterwards.
That is why people pick it: it is one argument, and the properties it fixes are genuinely present rather than spoofed. This covers what turning it on changes, and the two costs of leaving it on.
Turning it on
pip install seleniumbase
from seleniumbase import Driver
driver = Driver(uc=True, headless=True)
driver.get("https://example.com")
That is the whole thing, and it is the cleanest result we measured: every browser signal we checked came back right, consistently, with no version pin needed.
It has two costs, and neither is documented anywhere we could find. It takes seven times longer to start, and it stops sending your proxy password.
What it looks like running

This is your actual Chrome. The window belongs to an application called
Google Chrome, where a Playwright or Patchright window belongs to Google Chrome for Testing. That is the difference the section below is measuring: the
properties UC mode does not have to fix are the ones a real Chrome install
already has.
One thing the screenshot does not show, and we looked: no automation banner.
Neither with uc=True nor without it did Chrome display the "controlled by
automated test software" infobar, so that is not a way to tell the two apart.
What it reports
| Signal | uc=False | uc=True |
|---|---|---|
navigator.webdriver | true | false |
| user agent | HeadlessChrome/151 | Chrome/151 |
window.chrome | object | object |
navigator.plugins.length | 5 | 5 |
navigator.platform | MacIntel | MacIntel |
| launch time | 1.4 s | 10.4 s |
Two of those rows change and four do not, which is the useful part.
UC mode is doing less than its reputation suggests, because SeleniumBase was
already doing most of it. window.chrome, the plugin list and the platform are
correct with UC mode off, for the same reason Patchright's improve when you pass
channel="chrome": SeleniumBase drives the Chrome you have installed rather than
a bundled Chromium, so those properties are real rather than restored.
What UC mode adds on top is the webdriver flag and the user agent.
Reading the signals yourself
The table above is four properties any page can read. This is the whole check, and it runs the same against any driver you point it at:
from seleniumbase import Driver
SIGNALS = """() => ({
ua: navigator.userAgent,
platform: navigator.platform,
webdriver: String(navigator.webdriver),
chrome: typeof window.chrome,
plugins: navigator.plugins.length,
})"""
for uc in (False, True):
driver = Driver(uc=uc, headless=True)
try:
driver.get("https://example.com")
print(uc, driver.execute_script(f"return ({SIGNALS})()"))
finally:
driver.quit()
Time the launch while you are there, because that is the cost the next section is about:
import time
start = time.perf_counter()
driver = Driver(uc=True, headless=True)
print(f"launch took {time.perf_counter() - start:.1f}s")
driver.quit()
Consistency across the four signals
Across everything we ran on the same day, this was the only configuration where all four signals were right at once and the platform agreed with the user agent:
- Plain Playwright announced
HeadlessChromeand leftnavigator.webdrivertrue. - Patchright cleared the flag and kept
HeadlessChromein both configurations. - playwright-stealth fixed three
signals and then reported macOS and
Win32in the same call. - undetected-chromedriver would not connect at all until given a version pin.
The full table is in how to choose an anti-detect browser.
The launch-time cost
1.4 seconds to 10.4. That is nine seconds every time you open a browser.
It matters enormously or not at all depending on your shape. One long-lived browser working through a queue pays it once. A worker that starts a fresh browser per job, which is the usual pattern when each job needs its own proxy session, pays it every time: at ten thousand jobs that is twenty-five hours of launching.
That is the trade nobody states, and it is worth measuring on your own machine before you assume either answer.
Version pinning
Worth saying plainly, because the alternative did not. In the same session,
undetected-chromedriver 3.5.5 failed with session not created: cannot connect to chrome and only launched once given version_main=151. SeleniumBase needed
no equivalent argument.
from seleniumbase import Driver
driver = Driver(uc=True, headless=True)
driver.get("https://example.com")
Adding a proxy
SeleniumBase takes a proxy as a single string, where the Playwright-family tools take a dict:
driver = Driver(uc=True, headless=True,
proxy="user-session-abc123:secret@gate.example.com:7000")
That difference is worth pausing on, because it is where credentials break. A
password containing a colon or an at sign terminates the string early and the
endpoint answers 407 with nothing naming the cause. The
format converter will encode a credential
correctly for this form and for the separate-field form the other tools want.
Two provider-side traps sit under all of them. The session token is in the username at some providers and the password at others. And some providers take no username and password at all, expecting your IP on an allowlist. We record what each provider states about both on its provider page, dated, and say so where a provider states nothing.
UC mode and proxy credentials
Measured separately and worth knowing before you turn UC mode on. With uc=True,
SeleniumBase never sent the credentials to an authenticated proxy: sixteen
requests arrived and not one carried a Proxy-Authorization header, in three
consecutive runs, headed and headless alike. With UC mode off it authenticated
and loaded the page.
The details, and what eight other configurations did against the same proxy, are in how to use an authenticated proxy in Selenium.
Limitations
No anti-bot system, no evasion claim, no recommendation between these tools. Six signals and one timing from SeleniumBase 4.52.4 on Chrome 151, on one machine, on one day. Launch time especially is machine-dependent and worth re-running on your own hardware rather than taking ours.
Sources
- seleniumbase PyPI, read 27 Aug 2026
seleniumbase 4.52.4
Questions
What does SeleniumBase UC mode actually change?
In our reading it changed two things: navigator.webdriver went from true to false, and the user agent stopped saying HeadlessChrome. The other signals we checked were already correct with UC mode off, because SeleniumBase drives installed Chrome rather than a bundled Chromium.
Is SeleniumBase slower with UC mode on?
Yes, and by a lot. Launch went from 1.4 seconds to 10.4 on the same machine on 27 August 2026. That is a per-launch cost, so it matters most if you start a fresh browser per job and least if you hold one open.
Does SeleniumBase need a Chrome version pin?
It did not for us. It handled Chrome 151 with no version argument, in the same session where undetected-chromedriver 3.5.5 failed to connect until it was given version_main=151.
