Autenticazione Proxy in Selenium: 4 Configurazioni che Funzionano Davvero
Chrome apre una finestra di dialogo di autenticazione che Selenium non può gestire, e il trucco delle credenziali nell'URL fallisce silenziosamente. Ecco le quattro configurazioni che autenticano effettivamente un proxy in Selenium — classificate in base a quanto poco vi danneggeranno.
L'autenticazione proxy in Selenium è una trappola mascherata da one-liner. Il flag --proxy-server di Chrome accetta felicemente un indirizzo proxy — e ignora silenziosamente qualsiasi nome utente e password che vi si incorpori. Chrome quindi apre una finestra di dialogo di autenticazione nativa che WebDriver non può vedere, il vostro script si blocca, e la risposta più votata su Stack Overflow che trovate (113+ voti) lo risolve con un'estensione Manifest V2 che il Chrome moderno non carica più. Questa guida copre le quattro configurazioni che autenticano un proxy in Selenium oggi — whitelist degli IP, un'estensione Manifest V3, selenium-wire, e sapere quando affidare l'intero problema del browser a un'API.
Perché l'autenticazione proxy di base in Selenium fallisce
Tre fatti spiegano ogni tentativo fallito. Primo, Chromium rimuove le credenziali da --proxy-server=http://user:pass@host:port — il formato del flag semplicemente non supporta le credenziali. Secondo, la sfida 407 Proxy Authentication Required del proxy si manifesta come una finestra di dialogo nativa, al di fuori del DOM, dove send_keys non può arrivare. Terzo, il vecchio percorso DesiredCapabilities (socksUsername / socksPassword) si applicava solo ai proxy SOCKS e non ha mai funzionato per quelli HTTP — la configurazione che 'sembra giusta' e non fa nulla. Quindi le vere opzioni evitano completamente la finestra di dialogo.
Metodo 1: whitelist degli IP — zero codice, zero finestre di dialogo
Se il vostro scraper funziona da una macchina con un IP pubblico stabile, saltate completamente le credenziali: registrate quell'IP nel dashboard del vostro fornitore di proxy, e il gateway vi autentica tramite l'indirizzo di origine. Ogni piano QuantumProxies supporta la whitelist degli IP insieme a user:pass. Il lato Selenium diventa il semplice flag — che ha sempre funzionato bene senza autenticazione:
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()
Verificate sempre l'uscita prima di fidarvi di un'esecuzione: caricate un endpoint di eco IP e confermate che l'indirizzo appartiene al proxy, perché un flag configurato male fallisce silenziosamente e Chrome si connette direttamente. Il limite della whitelist è topologico: autentica una macchina, non uno script. Runner cloud effimeri, container dietro NAT e macchine CI con IP in cambiamento necessitano uno dei metodi seguenti.
Metodo 2: un'estensione Chrome Manifest V3
La soluzione classica genera una piccola estensione Chrome che imposta il proxy e risponde alla sfida di autenticazione tramite chrome.webRequest.onAuthRequired. Il famoso snippet del 2019 utilizza Manifest V2, che Chrome ha ora ritirato — la versione moderna necessita di manifest_version: 3, un service worker e il permesso webRequestAuthProvider. Questo costruisce e carica uno all'esecuzione:
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")
Due insidie. Le estensioni si caricano solo nella modalità nuova headless — il semplice --headless fallisce con un errore criptico 'failed to wait for extension background page', quindi --headless=new è obbligatorio. E caricare una directory non impacchettata tramite --load-extension è più affidabile attraverso le versioni di Chrome rispetto a impacchettare uno zip. Se preferite non mantenere questo, il pacchetto selenium-authenticated-proxy su PyPI genera l'estensione per voi da un singolo URL proxy.

Metodo 3: selenium-wire e i suoi compromessi
selenium-wire avvolge WebDriver con un proxy locale man-in-the-middle, che rende i proxy upstream autenticati — inclusi SOCKS5 — un semplice dizionario di opzioni:
# 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")
Sapere cosa si sta acquistando. Il progetto è stato archiviato dal suo manutentore all'inizio del 2024 e non riceve aggiornamenti, e poiché decripta il traffico localmente, il target vede la stretta di mano TLS di selenium-wire piuttosto che quella di Chrome — una discrepanza che i sistemi di fingerprinting JA3/JA4 segnalano anche quando il vostro IP è impeccabile. Rimane veramente utile per l'ispezione delle richieste durante lo sviluppo e per Firefox, dove il trucco dell'estensione non esiste. Per lo scraping di produzione su siti protetti, preferite i metodi 1-2, o passate a un livello superiore.
Firefox e il divario di autenticazione
Firefox accetta un proxy non autenticato pulitamente tramite le preferenze del profilo (network.proxy.type = 1 più impostazioni host e porta), ma non ha l'equivalente del trucco dell'estensione di Chrome per rispondere alla finestra di dialogo delle credenziali da WebDriver. In pratica, gli utenti di Firefox scelgono la whitelist degli IP o selenium-wire. Se il vostro unico motivo per Firefox era la gestione del proxy, quel motivo non è più valido.
Quando smettere di rattoppare Selenium e passare a un'API
L'autenticazione è la prima tassa, non l'ultima. Un'istanza di Chrome costa centinaia di MB di RAM, quindi alcune dozzine di sessioni concorrenti saturano un server; le versioni di ChromeDriver inseguono i rilasci di Chrome; e i fornitori di anti-bot rilevano Selenium vaniglia indipendentemente dall'IP dietro di esso — navigator.webdriver e artefatti CDP lo rivelano. Due aggiornamenti cambiano l'economia. Primo, eseguite i vostri browser tramite proxy residenziali così la reputazione dell'IP smette di essere il motivo per cui siete bloccati — oltre 90 milioni di IP domestici con rotazione per richiesta o sessioni stabili per flussi loggati. Secondo, quando mantenere i browser smette di valere la pena, un'API Scraper collassa l'intero stack in una chiamata HTTP: rende JavaScript su richiesta, gestisce IP e ritenta internamente, e restituisce HTML, markdown o JSON strutturato. Lo stesso compromesso si applica ai cugini di Selenium — vedete le nostre guide per integrazione proxy Playwright e configurazione proxy Puppeteer prima di presumere che un cambio di framework risolverà un problema di rilevamento.

Domande frequenti
Come imposto un proxy con autenticazione in Selenium ChromeDriver?
O whitelistate l'IP della vostra macchina con il fornitore di proxy e passate un semplice flag --proxy-server, o caricate una piccola estensione Manifest V3 che imposta il proxy e fornisce le credenziali tramite chrome.webRequest.onAuthRequired. Incorporare user:pass@ nel flag non funziona — Chromium lo ignora.
Perché Chrome mostra una finestra di login proxy con Selenium?
Il proxy ha risposto con 407 e Chrome sta chiedendo a un umano le credenziali. La finestra di dialogo è un'interfaccia utente nativa, invisibile a WebDriver, quindi nessun selettore o chiamata send_keys può riempirla. La soluzione è autenticarsi prima che la finestra di dialogo possa apparire: whitelist degli IP, un'estensione di autenticazione, o un livello MITM come selenium-wire.
Selenium-wire funziona ancora nel 2026?
Si installa e funziona ancora per molti carichi di lavoro, ma il progetto è stato archiviato all'inizio del 2024 e non riceve manutenzione. Il suo design MITM sostituisce anche l'impronta TLS di Chrome con una Python, che i moderni sistemi anti-bot rilevano. Trattatelo come uno strumento di debug, non la base di uno scraper di produzione.
Come uso un proxy autenticato con Firefox in Selenium?
Le preferenze del profilo di Firefox configurano l'indirizzo del proxy ma non possono rispondere al prompt delle credenziali, e non c'è una soluzione di estensione come su Chrome. Usate la whitelist degli IP così non sono necessarie credenziali, o instradate Firefox tramite selenium-wire, che gestisce localmente l'autenticazione upstream.
Funziona allo stesso modo in Java e C#?
Sì — la meccanica risiede in Chrome, non nel binding del linguaggio. La whitelist degli IP più --proxy-server è identica ovunque, e l'approccio dell'estensione Manifest V3 funziona da Java o C# scrivendo gli stessi due file e aggiungendo --load-extension a ChromeOptions. Solo selenium-wire è specifico per Python; altri linguaggi sostituiscono un proxy MITM locale come BrowserMob.
La versione breve: mai combattere la finestra di dialogo di autenticazione. Whitelist quando il vostro IP è stabile, generate un'estensione MV3 quando non lo è, mantenete selenium-wire per il lavoro di ispezione — e quando la manutenzione del browser supera i dati che produce, promuovete il lavoro a un'API e tenetevi le serate libere.