Direct Answer
To use an authenticated mobile proxy with Selenium, use SeleniumBase — an actively maintained framework built on Selenium. Pass your endpoint as Driver(proxy="USER:PASS@PROXY_HOST:PORT") and the browser exits through a real German mobile IP. The long-time standard, selenium-wire, was archived in January 2024; if you have existing selenium-wire code, switch the install to the maintained fork selenium-wire-lw — the API is identical.
Why Not Plain Selenium — and What Happened to selenium-wire?
Plain Selenium can point Chrome at a proxy with --proxy-server, but it has no built-in way to pass a username and password — and most real proxies need authentication. For years, selenium-wire filled that gap and was the standard answer. That changed: the project was archived on January 3, 2024 and is no longer maintained — current releases of its own dependencies (blinker 1.8+) break it, so fresh installs fail on modern Python setups.
As of 2026, there are three clean paths:
- SeleniumBase (recommended for new code) — actively maintained, authenticated proxies built in.
selenium-wire-lw(for existing selenium-wire code) — a maintained fork with the same API; swap the package, keep your code.- IP whitelisting (no credentials at all) — then plain Selenium's
--proxy-serveris enough.
Before You Start
You will need four values from your GermanProxy.io account:
- Host and port of your endpoint
- Username and password
The examples use PROXY_HOST, PORT, USER and PASS as placeholders — replace them with your own.
Option 1 — SeleniumBase (Recommended)
Install it first:
pip install seleniumbase
Then pass the endpoint straight to the Driver:
from seleniumbase import Driver
driver = Driver(proxy="USER:PASS@PROXY_HOST:PORT")
driver.get("https://www.example.de")
print(driver.title)
driver.quit()
SeleniumBase handles the proxy authentication for you — no auth pop-up, no manual workaround. The driver object is a regular Selenium WebDriver, so your existing find_element / get code keeps working. Authenticated proxies require a Chromium-based browser (the default).
Option 2 — Existing selenium-wire Code: the Maintained Fork
If your project already uses selenium-wire, don't rewrite it — replace the package with the maintained fork selenium-wire-lw. It keeps the same import and the same seleniumwire_options:
pip uninstall selenium-wire
pip install selenium-wire-lw selenium
Your code stays as it was:
from seleniumwire import webdriver
proxy_url = "http://USER:PASS@PROXY_HOST:PORT"
options = {
"proxy": {
"http": proxy_url,
"https": proxy_url,
"no_proxy": "localhost,127.0.0.1",
}
}
driver = webdriver.Chrome(seleniumwire_options=options)
driver.get("https://www.example.de")
print(driver.title)
driver.quit()
For SOCKS5, swap the scheme to socks5 (or socks5h to resolve DNS at the proxy):
proxy_url = "socks5://USER:PASS@PROXY_HOST:PORT"
The fork's local relay passes the credentials upstream — this is also the practical route for authenticated SOCKS5, which Chromium cannot do on its own.
Option 3 — Plain Selenium with IP Whitelisting
If you add your machine's public IP to the whitelist in your GermanProxy.io dashboard, the endpoint needs no credentials — and plain Selenium is enough:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("--proxy-server=http://PROXY_HOST:PORT")
driver = webdriver.Chrome(options=opts)
driver.get("https://www.example.de")
print(driver.title)
driver.quit()
This also works with --proxy-server=socks5://PROXY_HOST:PORT. Best suited to servers with a fixed outbound IP; if your IP changes (home ISP, VPN), re-add it or use Option 1.
Verify the IP First
Before you build the rest of your automation, point the driver at an IP-echo page and confirm it shows a German mobile IP — not your own address:
driver.get("https://api.ipify.org")
print(driver.find_element("tag name", "body").text)
If it shows your real IP, the proxy isn't applied; re-check the scheme, host, port and credentials.
Sticky Sessions vs. Rotation
- Sticky session: hold the same German mobile IP for a multi-step flow that should look like one continuous user.
- Rotation on demand: request a fresh IP to spread independent runs.
Choose per workflow — see sticky sessions and IP rotation explained.
Scrape Responsibly
A mobile proxy improves reliability for legitimate data collection — it is not a tool to circumvent access controls or platform rules. Keep your automation clean and defensible:
- Respect
robots.txtand each site's terms of service. - Send requests at a human-reasonable rate — add waits, don't hammer servers.
- Collect only what you need, and handle any personal data in line with the GDPR.
- Set an honest
User-Agentthat identifies your client, not a misleading one.
FAQ
What happened to selenium-wire?
The original project was archived on January 3, 2024 and no longer receives updates — newer releases of its blinker dependency (1.8+) break it, so it fails on current Python environments. For new projects use SeleniumBase; for existing code, selenium-wire-lw is a drop-in fork with the same from seleniumwire import webdriver API.
Can I use plain Selenium without extra packages?
Only if your endpoint needs no credentials — enable IP whitelisting in your dashboard, then --proxy-server=PROXY_HOST:PORT in Chrome options is enough. For username/password authentication, use SeleniumBase or the selenium-wire-lw fork; both avoid brittle pop-up workarounds.
Why do I get a 407 error?
407 Proxy Authentication Required means the credentials didn't reach the proxy. With SeleniumBase, confirm they're inside the proxy string (USER:PASS@PROXY_HOST:PORT); with the fork, confirm they're inside the proxy URL. See how to fix 407 proxy authentication required.
Does this work with undetected-chromedriver?
Use SeleniumBase's UC Mode instead — it is built on undetected-chromedriver and actively maintained: Driver(uc=True, proxy="USER:PASS@PROXY_HOST:PORT") takes the same proxy argument. For harder targets, SeleniumBase also offers CDP Mode as UC Mode's successor.
HTTP or SOCKS5?
For browser automation, the HTTP endpoint with username/password is the simplest path — Chromium itself cannot send SOCKS5 credentials. Use SOCKS5 either with IP whitelisting (Option 3) or through the selenium-wire-lw relay (Option 2). See the difference between HTTP and SOCKS5.
Should I switch to Playwright?
If you're starting fresh and not tied to Selenium, Playwright ships first-class authenticated proxy support — see the Python setup guide. Existing Selenium suites don't need to migrate: SeleniumBase keeps them running on a maintained stack.
CTA
Run your Selenium automation on real German mobile IPs. Get your German mobile endpoint — HTTP/SOCKS5/OpenVPN, sticky sessions, fair-use 20 GB/day.
Get a German mobile proxy: Real 4G/5G IPs from Germany, fair-use 20 GB/day — compare German mobile proxy plans or get a dedicated proxy on the Blue network.