Authentification Proxy Selenium : 4 Configurations Qui Fonctionnent Vraiment
Chrome affiche une boîte de dialogue d'authentification que Selenium ne peut pas toucher, et l'astuce des identifiants dans l'URL échoue silencieusement. Voici les quatre configurations qui authentifient réellement un proxy dans Selenium — classées par leur impact minimal.
L'authentification proxy Selenium est un piège déguisé en une ligne de code. Le flag --proxy-server de Chrome accepte une adresse de proxy sans problème — et ignore silencieusement tout nom d'utilisateur et mot de passe que vous y intégrez. Chrome affiche alors une boîte de dialogue d'authentification native que WebDriver ne peut pas voir, votre script se bloque, et la meilleure réponse sur Stack Overflow que vous trouvez (113+ votes) la résout avec une extension Manifest V2 que Chrome moderne ne charge plus. Ce guide couvre les quatre configurations qui authentifient un proxy dans Selenium aujourd'hui — liste blanche d'IP, une extension Manifest V3, selenium-wire, et savoir quand confier tout le problème du navigateur à une API.
Pourquoi l'authentification proxy basique de Selenium échoue
Trois faits expliquent chaque tentative échouée. Premièrement, Chromium supprime les identifiants de --proxy-server=http://user:pass@host:port — le format du flag n'a tout simplement pas de support pour les identifiants. Deuxièmement, le défi 407 Proxy Authentication Required du proxy apparaît sous forme de boîte de dialogue native, en dehors du DOM, où send_keys ne peut pas atteindre. Troisièmement, l'ancienne route DesiredCapabilities (socksUsername / socksPassword) s'appliquait uniquement aux proxies SOCKS et n'a jamais fonctionné pour ceux HTTP — la configuration qui 'semble correcte' et ne fait rien. Donc, les vraies options évitent toutes la boîte de dialogue.
Méthode 1 : Liste blanche d'IP — zéro code, zéro dialogues
Si votre scraper fonctionne depuis une machine avec une IP publique stable, évitez complètement les identifiants : enregistrez cette IP dans le tableau de bord de votre fournisseur de proxy, et la passerelle vous authentifie par adresse source. Chaque plan QuantumProxies prend en charge la liste blanche d'IP en plus de user:pass. Côté Selenium, cela devient le flag simple — qui a toujours bien fonctionné sans authentification :
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()
Vérifiez toujours la sortie avant de faire confiance à une exécution : chargez un point de terminaison d'écho IP et confirmez que l'adresse appartient au proxy, car un flag mal configuré échoue silencieusement et Chrome se connecte directement. La limite de la liste blanche est topologique : elle authentifie une machine, pas un script. Les exécuteurs cloud éphémères, les conteneurs derrière NAT et les machines CI avec des IP changeantes ont besoin de l'une des méthodes ci-dessous.
Méthode 2 : une extension Chrome Manifest V3
La solution classique génère une petite extension Chrome qui définit le proxy et répond au défi d'authentification via chrome.webRequest.onAuthRequired. Le célèbre extrait de 2019 utilise Manifest V2, que Chrome a maintenant retiré — la version moderne nécessite manifest_version: 3, un service worker, et la permission webRequestAuthProvider. Cela construit et charge une à l'exécution :
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")
Deux pièges. Les extensions ne se chargent que dans le nouveau mode sans tête — le simple --headless échoue avec une erreur cryptique 'failed to wait for extension background page', donc --headless=new est obligatoire. Et charger un répertoire décompressé via --load-extension est plus fiable à travers les versions de Chrome que de compresser un zip. Si vous préférez ne pas maintenir cela, le package selenium-authenticated-proxy sur PyPI génère l'extension pour vous à partir d'une seule URL de proxy.

Méthode 3 : selenium-wire, et ses compromis
selenium-wire enveloppe WebDriver avec un proxy local man-in-the-middle, ce qui rend les proxies en amont authentifiés — y compris SOCKS5 — un simple dictionnaire d'options :
# 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")
Sachez ce que vous achetez. Le projet a été archivé par son mainteneur début 2024 et ne reçoit aucune mise à jour, et parce qu'il déchiffre le trafic localement, la cible voit la poignée de main TLS de selenium-wire plutôt que celle de Chrome — un décalage que les systèmes de fingerprinting JA3/JA4 signalent même lorsque votre IP est impeccable. Il reste véritablement utile pour l'inspection des requêtes pendant le développement et pour Firefox, où l'astuce de l'extension n'existe pas. Pour le scraping en production sur des sites protégés, préférez les méthodes 1-2, ou montez d'un niveau.
Firefox, et le fossé d'authentification
Firefox accepte un proxy non authentifié proprement via les préférences de profil (network.proxy.type = 1 plus les paramètres d'hôte et de port), mais n'a pas d'équivalent de l'astuce d'extension de Chrome pour répondre à la boîte de dialogue d'identifiants depuis WebDriver. En pratique, les utilisateurs de Firefox choisissent la liste blanche d'IP ou selenium-wire. Si votre seule raison pour Firefox était sa gestion des proxies, cette raison ne tient plus.
Quand arrêter de patcher Selenium et passer à une API
L'authentification est la première taxe, pas la dernière. Une instance Chrome coûte des centaines de Mo de RAM, donc quelques dizaines de sessions simultanées saturent un serveur ; les versions de ChromeDriver suivent les sorties de Chrome ; et les vendeurs anti-bot détectent le Selenium vanille quel que soit l'IP derrière — navigator.webdriver et les artefacts CDP le trahissent. Deux améliorations changent l'économie. Premièrement, faites passer vos navigateurs par des proxies résidentiels pour que la réputation de l'IP cesse d'être la raison pour laquelle vous êtes bloqué — plus de 90 millions d'IPs domestiques avec rotation par requête ou sessions persistantes pour les flux connectés. Deuxièmement, lorsque maintenir les navigateurs ne vaut plus la peine, une Scraper API réduit toute la pile à un seul appel HTTP : elle rend JavaScript à la demande, gère les IP et les réessais en interne, et renvoie du HTML, du markdown ou du JSON structuré. Le même compromis s'applique aux cousins de Selenium — consultez nos guides sur l'intégration de proxy Playwright et la configuration de proxy Puppeteer avant de supposer qu'un changement de framework résoudra un problème de détection.

Questions fréquemment posées
Comment définir un proxy avec authentification dans Selenium ChromeDriver ?
Soit listez l'IP de votre machine auprès du fournisseur de proxy et passez un flag simple --proxy-server, soit chargez une petite extension Manifest V3 qui définit le proxy et fournit les identifiants via chrome.webRequest.onAuthRequired. Intégrer user:pass@ dans le flag ne fonctionne pas — Chromium l'ignore.
Pourquoi Chrome affiche-t-il une fenêtre de connexion proxy avec Selenium ?
Le proxy a répondu avec 407 et Chrome demande à un humain des identifiants. La boîte de dialogue est une interface utilisateur native, invisible pour WebDriver, donc aucun sélecteur ou appel send_keys ne peut la remplir. La solution est d'authentifier avant que la boîte de dialogue ne puisse apparaître : liste blanche d'IP, une extension d'authentification, ou une couche MITM comme selenium-wire.
Est-ce que selenium-wire fonctionne toujours en 2026 ?
Il s'installe et fonctionne toujours pour de nombreuses charges de travail, mais le projet a été archivé début 2024 et ne reçoit aucun entretien. Son design MITM remplace également l'empreinte TLS de Chrome par celle de Python, que les systèmes anti-bot modernes détectent. Considérez-le comme un outil de débogage, pas la base d'un scraper de production.
Comment utiliser un proxy authentifié avec Firefox dans Selenium ?
Les préférences de profil de Firefox configurent l'adresse du proxy mais ne peuvent pas répondre à l'invite d'identifiants, et il n'y a pas de solution d'extension comme sur Chrome. Utilisez la liste blanche d'IP pour qu'aucun identifiant ne soit nécessaire, ou routez Firefox via selenium-wire, qui gère l'authentification en amont localement.
Cela fonctionne-t-il de la même manière en Java et C# ?
Oui — la mécanique réside dans Chrome, pas dans le langage de liaison. La liste blanche d'IP plus --proxy-server est identique partout, et l'approche de l'extension Manifest V3 fonctionne depuis Java ou C# en écrivant les mêmes deux fichiers et en ajoutant --load-extension à ChromeOptions. Seul selenium-wire est spécifique à Python ; d'autres langages remplacent par un proxy MITM local tel que BrowserMob.
La version courte : ne luttez jamais contre la boîte de dialogue d'authentification. Listez en blanc lorsque votre IP est stable, générez une extension MV3 quand elle ne l'est pas, gardez selenium-wire pour le travail d'inspection — et lorsque la maintenance des navigateurs dépasse les données qu'elle produit, promouvez le travail à une API et gardez vos soirées.