如何在Selenium Chrome中使用带认证的HTTP代理?
Selenium Chrome带认证HTTP代理的正确实现
问题分析
你遇到的两个问题原因如下:
- 直接在
proxy-server参数中嵌入用户名密码的方式已被Chrome禁用,且参数中多余的单引号导致格式错误,触发ERR_NO_SUPPORTED_PROXIES。 - 使用
Proxy对象仅设置代理地址,但未提供认证信息,代理服务器会拒绝未授权请求,因此浏览器未实际使用代理。
解决方案
方法一:通过Chrome DevTools注入认证(推荐)
利用Chrome DevTools Protocol(CDP)在浏览器启动后注入代理认证信息,无需额外扩展,实现简单可靠:
ChromeOptions options = new ChromeOptions(); // 设置HTTP和HTTPS代理地址(不带认证信息) Proxy proxy = new Proxy(); proxy.setHttpProxy("1.1.1.1:8989"); proxy.setSslProxy("1.1.1.1:8989"); // 若需HTTPS代理,需同步设置 options.setProxy(proxy); // 启动ChromeDriver ChromeDriver driver = new ChromeDriver(options); // 初始化DevTools会话并注入认证信息 driver.getDevTools().createSession(); driver.getDevTools().send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); driver.getDevTools().send(Network.setAuthCredentials( "1.1.1.1", // 代理主机地址 8989, // 代理端口 "user", // 代理用户名 "pass" // 代理密码 )); // 验证代理是否生效 driver.get("https://httpbin.org/ip");
方法二:通过Chrome扩展自动处理认证
适合无法使用CDP的旧版本Chrome,需创建一个简单的扩展实现自动认证:
创建扩展文件
- 新建目录,添加
manifest.json:{ "version": "1.0.0", "manifest_version": 3, "name": "Proxy Auth AutoFill", "permissions": ["webRequest", "webRequestAuthProvider"], "host_permissions": ["<all_urls>"], "background": { "service_worker": "background.js" } } - 同目录添加
background.js:chrome.webRequest.onAuthRequired.addListener( (details) => ({ authCredentials: { username: "user", password: "pass" } }), {urls: ["<all_urls>"]}, ["blocking"] );
- 新建目录,添加
在Selenium中加载扩展:
ChromeOptions options = new ChromeOptions(); // 设置代理地址 Proxy proxy = new Proxy(); proxy.setHttpProxy("1.1.1.1:8989"); proxy.setSslProxy("1.1.1.1:8989"); options.setProxy(proxy); // 加载本地扩展(替换为你的扩展目录路径) options.addExtensions(new File("path/to/your/proxy-extension")); ChromeDriver driver = new ChromeDriver(options); driver.get("https://httpbin.org/ip");
关键注意事项
- Chrome不再支持在
proxy-server参数中直接嵌入user:pass@host:port格式的认证信息,请勿使用该方式。 - 若代理同时支持HTTP和HTTPS,需同时设置
setHttpProxy和setSslProxy,避免部分请求走默认网络。
内容的提问来源于stack exchange,提问作者DimaTverdoy
相关产品推荐
相关产品推荐

