Escape datacenter blocklists
Residential IPs avoid the datacenter ranges that anti-bot vendors block on sight, so Selenium sessions load real content instead of challenges.
Selenium drives a real browser across every major language, but it has no native way to pass proxy credentials, so authenticated residential proxies need the right approach. This guide uses selenium-wire to handle username and password cleanly, routes Selenium through ProxyOmega residential IPs, and covers geo-targeting, sticky sessions, and the errors you will hit.
Selenium is the long-established browser-automation framework, driving Chrome, Firefox, Edge, and Safari through the WebDriver protocol. It has bindings for Python, Java, C#, JavaScript, and Ruby, and it powers a huge amount of the world's automated testing and browser-based scraping. If you need to interact with a page the way a user does, across languages and browsers, Selenium is the default.
The trade-off is that WebDriver was designed for functional testing, not scraping, so some scraping concerns are not first-class. Proxy authentication is the clearest example: Selenium can point a browser at a proxy via WebDriver capabilities or Chrome options, but it has no built-in mechanism to supply a proxy username and password. Chrome does not accept credentials in the --proxy-server flag, and a WebDriver session cannot type into the native OS auth dialog.
The practical solution used across the ecosystem is selenium-wire, a drop-in extension of the Selenium bindings that runs a local proxy under the hood and injects your upstream credentials for you. It keeps your Selenium code almost unchanged while adding clean support for authenticated proxies, which is exactly what a residential proxy needs.
Selenium loads full pages in a real browser, opening many connections from one IP per page. On protected sites, a datacenter IP behind that traffic pattern draws CAPTCHAs, block pages, or throttling almost immediately. Residential IPs make the browser look like a normal visitor.
ProxyOmega assigns each Selenium session a real consumer IP that you can rotate or pin. Behind a genuine browser fingerprint, a residential address is often what turns a challenge page into full content.
Residential IPs avoid the datacenter ranges that anti-bot vendors block on sight, so Selenium sessions load real content instead of challenges.
Run multiple WebDriver instances, each with its own proxy username, to scrape concurrently from different residential IPs without state bleeding across sessions.
Target the exit country so the site serves local pricing, language, and inventory, matching what a regional user would see.
Sticky sessions keep one IP across a login and the pages after it, so the target does not flag a mid-session address change.
Because Selenium cannot pass proxy credentials natively, use selenium-wire, which handles authenticated upstream proxies with a simple options dict. Install it with pip install selenium-wire, then pass a seleniumwire_options dict containing your ProxyOmega endpoint with credentials embedded in the URL. The username carries targeting parameters (here -country-us) and the password is your dashboard API key.
For Budget Unlimited, use residential.proxyomega.com with any port from 10000 to 10199. Each port serves HTTP, HTTPS, and SOCKS5 on the same port. selenium-wire runs a local proxy, forwards your traffic upstream to ProxyOmega, and injects authentication for you, so your Selenium code stays otherwise standard.
# pip install selenium-wire
from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
# Targeting params attach to the username, dash-separated.
USERNAME = "user123-country-us"
PASSWORD = "your_dashboard_api_key" # account API key
HOST = "residential.proxyomega.com:10000"
seleniumwire_options = {
"proxy": {
"http": f"http://{USERNAME}:{PASSWORD}@{HOST}",
"https": f"http://{USERNAME}:{PASSWORD}@{HOST}",
"no_proxy": "localhost,127.0.0.1",
}
}
options = Options()
options.add_argument("--headless=new")
driver = webdriver.Chrome(
options=options,
seleniumwire_options=seleniumwire_options,
)
driver.get("https://api.ipify.org?format=json")
print(driver.find_element("tag name", "body").text) # residential exit IP
driver.quit()The upstream username is fixed for the life of a driver, so the simplest rotation in Selenium is a new driver (or a new username) per task. On Budget Unlimited the pool also rotates on the dashboard interval, so fresh drivers usually get fresh IPs.
When a flow spans several pages and the target ties state to the source IP, hold one address with a sticky session. Add -session-<id> to the username, optionally with -ttl-<minutes>, and reuse it for the driver's lifetime. Start the next driver with a new id to get a new IP.
Create a new driver (optionally without a session parameter) per task. With the dashboard rotation interval, each session loads from a different residential IP, ideal for many independent pages.
Add -session-job9-ttl-20 to the username to hold one IP for twenty minutes across a login and its follow-up pages. Keep the driver alive for the flow, then rotate the id.
Selenium loads full browser pages, so bandwidth and targeting drive the choice. Start on Budget Unlimited and move up for throughput or precision.
| Workload | Plan | Why |
|---|---|---|
| General browser scraping | Budget Unlimited (:10000) | Unlimited bandwidth for full page loads; rotating pool plus country targeting covers most work. |
| Many parallel drivers or heavy pages | Premium Unlimited (:8000) | Dedicated 200Mbps-1Gbps throughput keeps concurrent WebDriver sessions fast. |
| City/state/ASN precision | Platinum (:20228) | Pay-per-GB with the finest geo-targeting for localized page tests. |
| Mobile-rendered targets | Mobile (:20229) | Real 4G/5G IPs for sites that serve carrier traffic differently. |
| Whitelisted fixed IP | Static ISP (:30000) | One stable US (Dallas) address for targets that require a consistent source IP. |
Most Selenium proxy pain is authentication-related, which is why selenium-wire exists. Work through these checks.
Confirm the credentials embedded in the selenium-wire proxy URL are correct: the password is your dashboard API key, not your login password. Also verify the username's targeting parameters are valid for the plan, since a parameter that does not apply to the product rejects the whole username.
That happens when you configure the proxy through plain Chrome options instead of selenium-wire. WebDriver cannot type into the OS dialog, so use selenium-wire (as shown) to inject credentials automatically.
If IP whitelisting is enabled on your account, add the machine's public IP to the dashboard allowlist. With whitelisting on, requests from other addresses are dropped after authentication. Also confirm the port is in the 10000-10199 range.
selenium-wire intercepts HTTPS with its own local certificate. If a site errors, ensure selenium-wire is up to date; as a last resort add --ignore-certificate-errors to Chrome options for scraping (not for handling sensitive credentials).
1.5M+ IPs, 200+ countries, SOCKS5 on every port.
90M+ ethically-sourced IPs across 200+ countries and 30,000+ cities. Residential, mobile, ISP and IPv6 proxies for scraping and AI agents.