Integration Scraping framework

Selenium Proxy Setup

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.

  • 200+countries
  • 1.5M+residential IPs
  • SOCKS5on every port
Selenium

What is Selenium?

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

Why Selenium needs residential proxies

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.

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.

Parallel sessions

Run multiple WebDriver instances, each with its own proxy username, to scrape concurrently from different residential IPs without state bleeding across sessions.

Geo-targeted pages

Target the exit country so the site serves local pricing, language, and inventory, matching what a regional user would see.

Stable login flows

Sticky sessions keep one IP across a login and the pages after it, so the target does not flag a mid-session address change.

Selenium

Using ProxyOmega with Selenium

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()
Selenium

Rotating vs sticky sessions

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.

Rotating per driver

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.

Sticky per session

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

Which ProxyOmega plan to pick

Selenium loads full browser pages, so bandwidth and targeting drive the choice. Start on Budget Unlimited and move up for throughput or precision.

WorkloadPlanWhy
General browser scrapingBudget Unlimited (:10000)Unlimited bandwidth for full page loads; rotating pool plus country targeting covers most work.
Many parallel drivers or heavy pagesPremium Unlimited (:8000)Dedicated 200Mbps-1Gbps throughput keeps concurrent WebDriver sessions fast.
City/state/ASN precisionPlatinum (:20228)Pay-per-GB with the finest geo-targeting for localized page tests.
Mobile-rendered targetsMobile (:20229)Real 4G/5G IPs for sites that serve carrier traffic differently.
Whitelisted fixed IPStatic ISP (:30000)One stable US (Dallas) address for targets that require a consistent source IP.
Selenium

Troubleshooting

Most Selenium proxy pain is authentication-related, which is why selenium-wire exists. Work through these checks.

407 Proxy Authentication Required

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.

Native auth dialog appears

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.

Connection reset / refused

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.

SSL or certificate errors

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).

FAQ

Frequently asked questions

Why can't plain Selenium handle proxy authentication?
WebDriver has no API to pass proxy credentials, and Chrome ignores them in --proxy-server while triggering a native auth dialog Selenium cannot fill. selenium-wire solves this by injecting credentials through a local proxy.
Is selenium-wire the only option?
It is the simplest for authenticated proxies in Python. Alternatives include building a small Chrome extension that sets the Proxy-Authorization header, or IP whitelisting your machine so no credentials are needed. selenium-wire is the most direct.
Do I need a separate SOCKS5 port?
No. Every ProxyOmega port serves HTTP, HTTPS, and SOCKS5 on the same port. selenium-wire also supports a socks5 scheme in the proxy dict if you prefer SOCKS.
How do I target a specific country?
Append -country-<code> to the username in the selenium-wire proxy URL, for example user123-country-ca. Change it per driver to scrape from different regions.
How do I hold one IP across a login?
Add -session-<id> to the username, optionally with -ttl-<minutes>. Reuse the id for the driver's lifetime to keep the same exit IP; use a new id for a fresh address.
What is the proxy password?
It is your account API key from the ProxyOmega dashboard, not your login password. Store it in an environment variable rather than in code.

Authenticated residential proxies for Selenium Start routing today.

1.5M+ IPs, 200+ countries, SOCKS5 on every port.

ProxyOmega ProxyOmega

90M+ ethically-sourced IPs across 200+ countries and 30,000+ cities. Residential, mobile, ISP and IPv6 proxies for scraping and AI agents.

GDPRCCPA
Product
Premium Unlimited Budget Unlimited Residential / ISP Mobile IPv6 Chrome Extension
Solutions
Web scraping AI agents Price monitoring SERP & SEO Integrations All use cases
Resources
Glossary Error codes Free tools Proxies by platform Locations
Company
About Blog Docs Reseller program Affiliate Contact Sign in
© 2026 ProxyOmega Ltd. All rights reserved.