Autenticação de Proxy no Selenium: 4 Configurações que Realmente Funcionam

O Chrome exibe uma caixa de diálogo de autenticação que o Selenium não consegue manipular, e o truque de credenciais na URL falha silenciosamente. Aqui estão as quatro configurações que realmente autenticam um proxy no Selenium — classificadas por quão pouco elas irão prejudicar.

A autenticação de proxy no Selenium é uma armadilha disfarçada de uma linha de código. A flag --proxy-server do Chrome aceita um endereço de proxy alegremente — e ignora silenciosamente qualquer nome de usuário e senha que você embutir. O Chrome então exibe uma caixa de diálogo de autenticação nativa que o WebDriver não consegue ver, seu script trava, e a principal resposta do Stack Overflow que você encontra (113+ votos) resolve isso com uma extensão Manifest V2 que o Chrome moderno não carrega mais. Este guia cobre as quatro configurações que autenticam um proxy no Selenium hoje — lista branca de IPs, uma extensão Manifest V3, selenium-wire, e saber quando entregar todo o problema do navegador a uma API.

Por que a autenticação básica de proxy no Selenium falha

Três fatos explicam todas as tentativas fracassadas. Primeiro, o Chromium remove credenciais de --proxy-server=http://user:pass@host:port — o formato da flag simplesmente não tem suporte a credenciais. Segundo, o desafio 407 Proxy Authentication Required do proxy aparece como uma caixa de diálogo nativa, fora do DOM, onde send_keys não consegue alcançar. Terceiro, a antiga rota DesiredCapabilities (socksUsername / socksPassword) só se aplicava a proxies SOCKS e nunca funcionou para HTTP — a configuração que 'parece certa' e não faz nada. Portanto, as opções reais evitam completamente a caixa de diálogo.

Método 1: Lista branca de IPs — zero código, zero caixas de diálogo

Se o seu scraper roda em uma máquina com um IP público estável, ignore as credenciais completamente: registre esse IP no painel do seu provedor de proxy, e o gateway autentica você pelo endereço de origem. Todo plano da QuantumProxies suporta lista branca de IPs junto com user:pass. O lado do Selenium se torna a flag simples — que sempre funcionou bem sem autenticação:

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

Sempre verifique a saída antes de confiar em uma execução: carregue um endpoint de eco de IP e confirme que o endereço pertence ao proxy, porque uma flag mal configurada falha silenciosamente e o Chrome simplesmente conecta diretamente. O limite da lista branca é topológico: ela autentica uma máquina, não um script. Runners em nuvem efêmeros, contêineres atrás de NAT e máquinas CI com IPs mutáveis precisam de um dos métodos abaixo.

Método 2: uma extensão Chrome Manifest V3

A correção clássica gera uma pequena extensão Chrome que define o proxy e responde ao desafio de autenticação via chrome.webRequest.onAuthRequired. O famoso snippet de 2019 usa Manifest V2, que o Chrome agora aposentou — a versão moderna precisa de manifest_version: 3, um service worker, e a permissão webRequestAuthProvider. Isso constrói e carrega uma em tempo de execução:

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

Dois riscos. Extensões só carregam no novo modo headless — o simples --headless falha com um erro críptico 'falha ao esperar pela página de fundo da extensão', então --headless=new é obrigatório. E carregar um diretório descompactado via --load-extension é mais confiável em versões do Chrome do que empacotar um zip. Se você preferir não manter isso, o pacote selenium-authenticated-proxy no PyPI gera a extensão para você a partir de uma única URL de proxy.

Comparação de quatro métodos de autenticação de proxy no Selenium: lista branca de IPs, extensão Manifest V3, selenium-wire e uma API de scraping
A lista branca vence quando seu IP de saída é fixo; a extensão MV3 vence em máquinas efêmeras; o selenium-wire troca conveniência por uma impressão digital MITM.

Método 3: selenium-wire, e suas concessões

O selenium-wire envolve o WebDriver com um proxy local man-in-the-middle, o que torna proxies upstream autenticados — incluindo SOCKS5 — um simples dicionário de opções:

# 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")

Saiba o que você está comprando. O projeto foi arquivado pelo seu mantenedor no início de 2024 e não recebe atualizações, e porque ele descriptografa o tráfego localmente, o alvo vê o handshake TLS do selenium-wire em vez do do Chrome — uma incompatibilidade que sistemas de impressão digital JA3/JA4 sinalizam mesmo quando seu IP está impecável. Ele continua sendo genuinamente útil para inspeção de requisições durante o desenvolvimento e para o Firefox, onde o truque da extensão não existe. Para scraping em produção em sites protegidos, prefira os métodos 1-2, ou suba um nível.

Firefox, e a lacuna de autenticação

O Firefox aceita um proxy não autenticado de forma limpa através das preferências do perfil (network.proxy.type = 1 mais configurações de host e porta), mas não tem equivalente ao truque da extensão do Chrome para responder à caixa de diálogo de credenciais a partir do WebDriver. Na prática, os usuários do Firefox escolhem lista branca de IPs ou selenium-wire. Se sua única razão para o Firefox era seu manuseio de proxy, essa razão não se sustenta mais.

Quando parar de remendar o Selenium e mudar para uma API

A autenticação é o primeiro imposto, não o último. Uma instância do Chrome custa centenas de MB de RAM, então algumas dezenas de sessões concorrentes saturam um servidor; as versões do ChromeDriver acompanham os lançamentos do Chrome; e os fornecedores de anti-bot detectam o Selenium padrão independentemente do IP por trás dele — navigator.webdriver e artefatos do CDP o denunciam. Duas atualizações mudam a economia. Primeiro, execute seus navegadores através de proxies residenciais para que a reputação do IP deixe de ser a razão pela qual você é bloqueado — mais de 90 milhões de IPs domésticos com rotação por requisição ou sessões fixas para fluxos logados. Segundo, quando manter navegadores deixa de valer a pena, uma Scraper API colapsa toda a pilha em uma única chamada HTTP: ela renderiza JavaScript sob demanda, gerencia IPs e tentativas internamente, e retorna HTML, markdown ou JSON estruturado. O mesmo trade-off se aplica aos primos do Selenium — veja nossos guias para integração de proxy Playwright e configuração de proxy Puppeteer antes de assumir que uma mudança de framework resolverá um problema de detecção.

Escada de escalonamento da lista branca de proxy no Selenium para extensão Manifest V3 para proxies residenciais para uma API de scraping
Suba apenas até onde o alvo o forçar: flag, extensão, melhores IPs, depois deixe uma API executar os navegadores.

Perguntas frequentes

Como configuro um proxy com autenticação no Selenium ChromeDriver?

Ou liste o IP da sua máquina com o provedor de proxy e passe uma flag simples --proxy-server, ou carregue uma pequena extensão Manifest V3 que define o proxy e fornece credenciais através de chrome.webRequest.onAuthRequired. Embutir user:pass@ na flag não funciona — o Chromium ignora.

Por que o Chrome mostra uma janela de login de proxy com o Selenium?

O proxy respondeu com 407 e o Chrome está pedindo credenciais a um humano. A caixa de diálogo é uma interface nativa, invisível para o WebDriver, então nenhum seletor ou chamada send_keys pode preenchê-la. A solução é autenticar antes que a caixa de diálogo possa aparecer: lista branca de IPs, uma extensão de autenticação, ou uma camada MITM como o selenium-wire.

O selenium-wire ainda funciona em 2026?

Ainda é instalado e funciona para muitas cargas de trabalho, mas o projeto foi arquivado no início de 2024 e não recebe manutenção. Seu design MITM também substitui a impressão digital TLS do Chrome por uma em Python, que sistemas modernos de anti-bot detectam. Trate-o como uma ferramenta de depuração, não a base de um scraper de produção.

Como uso um proxy autenticado com o Firefox no Selenium?

As preferências de perfil do Firefox configuram o endereço do proxy, mas não podem responder ao prompt de credenciais, e não há solução de extensão como no Chrome. Use lista branca de IPs para que nenhuma credencial seja necessária, ou roteie o Firefox através do selenium-wire, que lida com a autenticação upstream localmente.

Isso funciona da mesma forma em Java e C#?

Sim — a mecânica está no Chrome, não na ligação de linguagem. Lista branca de IPs mais --proxy-server é idêntico em todos os lugares, e a abordagem de extensão Manifest V3 funciona a partir de Java ou C# escrevendo os mesmos dois arquivos e adicionando --load-extension ao ChromeOptions. Apenas o selenium-wire é específico para Python; outras linguagens substituem por um proxy MITM local como o BrowserMob.

A versão curta: nunca lute contra a caixa de diálogo de autenticação. Liste quando seu IP for estável, gere uma extensão MV3 quando não for, mantenha o selenium-wire para trabalho de inspeção — e quando a manutenção do navegador superar os dados que produz, promova o trabalho para uma API e aproveite suas noites.

Execute o Selenium em IPs residenciais