Selenium Proxy-Authentifizierung: 4 Setups, die tatsächlich funktionieren
Chrome öffnet einen Authentifizierungsdialog, den Selenium nicht berühren kann, und der Trick mit den Anmeldedaten in der URL schlägt stillschweigend fehl. Hier sind die vier Setups, die tatsächlich einen Proxy in Selenium authentifizieren – geordnet danach, wie wenig sie schaden.
Selenium Proxy-Authentifizierung ist eine Falle, die als Einzeiler getarnt ist. Der --proxy-server Chrome-Flag akzeptiert eine Proxy-Adresse problemlos – und ignoriert stillschweigend jeden Benutzernamen und jedes Passwort, das Sie darin einbetten. Chrome öffnet dann einen nativen Authentifizierungsdialog, den WebDriver nicht sehen kann, Ihr Skript hängt, und die oberste Antwort auf Stack Overflow (113+ Stimmen) löst es mit einer Manifest V2-Erweiterung, die modernes Chrome nicht mehr lädt. Dieser Leitfaden behandelt die vier Setups, die heute einen Proxy in Selenium authentifizieren – IP-Whitelisting, eine Manifest V3-Erweiterung, selenium-wire und wann man das gesamte Browserproblem an eine API übergeben sollte.
Warum grundlegende Selenium Proxy-Authentifizierung fehlschlägt
Drei Fakten erklären jeden gescheiterten Versuch. Erstens, Chromium entfernt Anmeldedaten aus --proxy-server=http://user:pass@host:port – das Flag-Format unterstützt einfach keine Anmeldedaten. Zweitens, die 407 Proxy Authentication Required-Herausforderung des Proxys erscheint als nativer Dialog, außerhalb des DOM, wo send_keys nicht hinkommt. Drittens, der alte DesiredCapabilities-Weg (socksUsername / socksPassword) galt nur für SOCKS-Proxys und funktionierte nie für HTTP – die Konfiguration, die 'richtig aussieht' und nichts tut. Die echten Optionen umgehen den Dialog vollständig.
Methode 1: IP-Whitelisting – null Code, null Dialoge
Wenn Ihr Scraper von einer Maschine mit einer stabilen öffentlichen IP läuft, überspringen Sie die Anmeldedaten vollständig: Registrieren Sie diese IP im Dashboard Ihres Proxy-Anbieters, und das Gateway authentifiziert Sie über die Quelladresse. Jeder QuantumProxies-Plan unterstützt IP-Whitelisting neben user:pass. Auf der Selenium-Seite wird das einfache Flag verwendet – das ohne Authentifizierung immer gut funktioniert hat:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://gate.quantumproxies.io:PORT")
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
driver.get("https://httpbin.org/ip")
print(driver.find_element("tag name", "body").text) # proxy exit IP
driver.quit()
Überprüfen Sie immer den Ausgang, bevor Sie einem Lauf vertrauen: Laden Sie einen IP-Echo-Endpunkt und bestätigen Sie, dass die Adresse zum Proxy gehört, da ein falsch konfiguriertes Flag stillschweigend fehlschlägt und Chrome einfach direkt verbindet. Die Grenze des Whitelistings ist topologisch: Es authentifiziert eine Maschine, nicht ein Skript. Kurzlebige Cloud-Runner, Container hinter NAT und CI-Maschinen mit wechselnden IPs benötigen eine der untenstehenden Methoden.
Methode 2: eine Manifest V3 Chrome-Erweiterung
Der klassische Fix erzeugt eine kleine Chrome-Erweiterung, die den Proxy setzt und die Authentifizierungsherausforderung über chrome.webRequest.onAuthRequired beantwortet. Das berühmte Snippet von 2019 verwendet Manifest V2, das Chrome jetzt eingestellt hat – die moderne Version benötigt manifest_version: 3, einen Service Worker und die Berechtigung webRequestAuthProvider. Dies baut und lädt eine zur Laufzeit:
import json, os, tempfile
from selenium import webdriver
HOST, PORT = "gate.quantumproxies.io", "PORT"
USER, PASS = "USER", "PASS"
manifest = {
"name": "Proxy Auth", "version": "1.0", "manifest_version": 3,
"permissions": ["proxy", "webRequest", "webRequestAuthProvider"],
"host_permissions": ["<all_urls>"],
"background": {"service_worker": "worker.js"},
}
worker = """
chrome.proxy.settings.set({
value: { mode: "fixed_servers", rules: {
singleProxy: { scheme: "http", host: "%s", port: parseInt("%s") },
bypassList: ["localhost"] } },
scope: "regular"
}, function() {});
chrome.webRequest.onAuthRequired.addListener(
function(details) {
return { authCredentials: { username: "%s", password: "%s" } };
},
{ urls: ["<all_urls>"] },
["blocking"]
);
""" % (HOST, PORT, USER, PASS)
ext_dir = tempfile.mkdtemp()
with open(os.path.join(ext_dir, "manifest.json"), "w") as f:
json.dump(manifest, f)
with open(os.path.join(ext_dir, "worker.js"), "w") as f:
f.write(worker)
options = webdriver.ChromeOptions()
options.add_argument("--load-extension=" + ext_dir)
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
driver.get("https://httpbin.org/ip")
Zwei Stolperfallen. Erweiterungen werden nur im neuen Headless-Modus geladen – einfaches --headless schlägt mit einem kryptischen 'failed to wait for extension background page'-Fehler fehl, daher ist --headless=new zwingend erforderlich. Und das Laden eines nicht gepackten Verzeichnisses über --load-extension ist über Chrome-Versionen hinweg zuverlässiger als das Packen einer ZIP. Wenn Sie dies nicht pflegen möchten, generiert das selenium-authenticated-proxy-Paket auf PyPI die Erweiterung für Sie aus einer einzigen Proxy-URL.

Methode 3: selenium-wire und seine Kompromisse
selenium-wire umhüllt WebDriver mit einem lokalen Man-in-the-Middle-Proxy, der authentifizierte Upstream-Proxys – einschließlich SOCKS5 – zu einem einfachen Options-Dict macht:
# pip install selenium-wire
from seleniumwire import webdriver
options = {
"proxy": {
"http": "http://USER:PASS@gate.quantumproxies.io:PORT",
"https": "http://USER:PASS@gate.quantumproxies.io:PORT",
"no_proxy": "localhost,127.0.0.1",
}
}
driver = webdriver.Chrome(seleniumwire_options=options)
driver.get("https://httpbin.org/ip")
Wissen Sie, was Sie kaufen. Das Projekt wurde Anfang 2024 von seinem Betreuer archiviert und erhält keine Updates, und da es den Datenverkehr lokal entschlüsselt, sieht das Ziel den TLS-Handshake von selenium-wire anstelle von Chrome – ein Missverhältnis, das JA3/JA4-Fingerprinting-Systeme kennzeichnen, selbst wenn Ihre IP einwandfrei ist. Es bleibt wirklich nützlich für die Anforderungsinspektion während der Entwicklung und für Firefox, wo der Erweiterungstrick nicht existiert. Für das Scraping in der Produktion auf geschützten Seiten bevorzugen Sie die Methoden 1-2 oder steigen Sie eine Ebene höher.
Firefox und die Authentifizierungslücke
Firefox akzeptiert einen nicht authentifizierten Proxy problemlos über Profileinstellungen (network.proxy.type = 1 plus Host- und Porteinstellungen), hat jedoch kein Äquivalent zu Chromes Erweiterungstrick, um den Anmeldedialog von WebDriver zu beantworten. In der Praxis wählen Firefox-Nutzer IP-Whitelisting oder selenium-wire. Wenn Ihr einziger Grund für Firefox dessen Proxy-Handhabung war, gilt dieser Grund nicht mehr.
Wann man aufhören sollte, Selenium zu patchen und zu einer API zu wechseln
Authentifizierung ist die erste Hürde, nicht die letzte. Eine Chrome-Instanz kostet Hunderte von MB RAM, sodass ein paar Dutzend gleichzeitige Sitzungen einen Server sättigen; ChromeDriver-Versionen folgen den Chrome-Veröffentlichungen; und Anti-Bot-Anbieter erkennen Vanilla Selenium unabhängig von der dahinterliegenden IP – navigator.webdriver und CDP-Artefakte verraten es. Zwei Upgrades ändern die Wirtschaftlichkeit. Erstens, führen Sie Ihre Browser über residential proxies, damit die IP-Reputation nicht mehr der Grund ist, warum Sie blockiert werden – über 90 Millionen Haushalts-IPs mit Rotation pro Anfrage oder Sticky-Sessions für eingeloggte Abläufe. Zweitens, wenn die Wartung von Browsern sich nicht mehr lohnt, reduziert eine Scraper API den gesamten Stack auf einen HTTP-Aufruf: Sie rendert JavaScript auf Abruf, verwaltet IPs und Wiederholungen intern und liefert HTML, Markdown oder strukturiertes JSON zurück. Der gleiche Kompromiss gilt für Seleniums Verwandte – sehen Sie sich unsere Anleitungen zur Playwright Proxy-Integration und Puppeteer Proxy-Setup an, bevor Sie annehmen, dass ein Framework-Wechsel ein Erkennungsproblem lösen wird.

Häufig gestellte Fragen
Wie setze ich einen Proxy mit Authentifizierung in Selenium ChromeDriver?
Entweder whitelisten Sie die IP Ihrer Maschine beim Proxy-Anbieter und übergeben ein einfaches --proxy-server-Flag, oder laden Sie eine kleine Manifest V3-Erweiterung, die den Proxy setzt und Anmeldedaten über chrome.webRequest.onAuthRequired bereitstellt. Das Einbetten von user:pass@ im Flag funktioniert nicht – Chromium ignoriert es.
Warum zeigt Chrome ein Proxy-Anmelde-Popup mit Selenium?
Der Proxy hat mit 407 geantwortet und Chrome fragt einen Menschen nach Anmeldedaten. Der Dialog ist eine native Benutzeroberfläche, die für WebDriver unsichtbar ist, sodass kein Selektor oder send_keys-Aufruf ihn ausfüllen kann. Die Lösung besteht darin, sich zu authentifizieren, bevor der Dialog erscheinen kann: IP-Whitelisting, eine Authentifizierungserweiterung oder eine MITM-Schicht wie selenium-wire.
Funktioniert selenium-wire noch im Jahr 2026?
Es lässt sich immer noch installieren und funktioniert für viele Workloads, aber das Projekt wurde Anfang 2024 archiviert und erhält keine Wartung. Sein MITM-Design ersetzt auch den TLS-Fingerabdruck von Chrome durch einen von Python, den moderne Anti-Bot-Systeme erkennen. Behandeln Sie es als Debugging-Tool, nicht als Grundlage eines Produktions-Scrapers.
Wie verwende ich einen authentifizierten Proxy mit Firefox in Selenium?
Firefox-Profilpräferenzen konfigurieren die Proxy-Adresse, können jedoch die Anmeldeaufforderung nicht beantworten, und es gibt keinen Erweiterungs-Workaround wie bei Chrome. Verwenden Sie IP-Whitelisting, sodass keine Anmeldedaten benötigt werden, oder leiten Sie Firefox über selenium-wire, das die Upstream-Authentifizierung lokal behandelt.
Funktioniert das genauso in Java und C#?
Ja – die Mechanik liegt in Chrome, nicht in der Sprachbindung. IP-Whitelisting plus --proxy-server ist überall identisch, und der Ansatz mit der Manifest V3-Erweiterung funktioniert in Java oder C#, indem dieselben zwei Dateien geschrieben und --load-extension zu ChromeOptions hinzugefügt werden. Nur selenium-wire ist Python-spezifisch; andere Sprachen ersetzen es durch einen lokalen MITM-Proxy wie BrowserMob.
Die Kurzversion: Kämpfen Sie niemals gegen den Authentifizierungsdialog. Whitelisten Sie, wenn Ihre IP stabil ist, generieren Sie eine MV3-Erweiterung, wenn sie es nicht ist, behalten Sie selenium-wire für Inspektionsarbeiten – und wenn die Browserwartung die erzeugten Daten übersteigt, befördern Sie den Job zu einer API und behalten Sie Ihre Abende.