Java环境下Selenium配置代理无法连接站点,代理活跃但程序失效
Selenium 配置带认证代理连接超时问题解决
在Java中使用Selenium配置代理访问站点时无法连接,代理服务器处于活跃状态,但程序中无法正常工作,报错
net::ERR_CONNECTION_TIMED_OUT,代码如下:
public void start(){ String proxyAddress = "130.185.126.159"; int proxyPort = 6774; String proxyUsername = "lznbghpe"; String proxyPassword = "16z9hv6q9fhu"; Proxy proxy = new Proxy(); proxy.setHttpProxy(proxyAddress + ":" + proxyPort); proxy.setSslProxy(proxyAddress + ":" + proxyPort); String proxyAuth = proxyUsername + ":" + proxyPassword; proxy.setProxyType(Proxy.ProxyType.MANUAL); proxy.setHttpProxy(proxyAuth + "@" + proxyAddress + ":" + proxyPort); proxy.setSslProxy(proxyAuth + "@" + proxyAddress + ":" + proxyPort); ChromeOptions options = new ChromeOptions(); options.setProxy(proxy); options.addArguments("--headless"); // Run in headless mode options.addArguments("start-maximized"); WebDriver driver = new ChromeDriver(options); driver.get("https://mycgsportal.com/MyCGS/CGSAccount/Login"); System.out.println(driver.getTitle()); }
运行后报错:
Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: net::ERR_CONNECTION_TIMED_OUT
问题根源
你代码里直接用用户名:密码@代理地址:端口的方式设置代理是无效的——Chrome浏览器本身不支持这种URL嵌入认证信息的方式传递账号密码,导致代理请求未携带正确的认证信息,最终触发连接超时。
解决办法
方法一:Chrome扩展自动注入代理认证(兼容性强)
通过自定义Chrome扩展实现代理认证的自动注入,适合所有版本的ChromeDriver:
- 创建扩展配置文件
manifest.json:
{ "version": "1.0.0", "manifest_version": 3, "name": "Proxy Auth Helper", "permissions": ["proxy", "tabs", "storage", "<all_urls>"], "background": { "service_worker": "background.js" }, "minimum_chrome_version": "100" }
- 创建扩展逻辑文件
background.js:
// 配置代理服务器信息 const proxyConfig = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "130.185.126.159", port: 6774 }, bypassList: ["localhost"] } }; // 应用代理配置 chrome.proxy.settings.set({value: proxyConfig, scope: "regular"}, () => {}); // 自动注入认证信息 chrome.webRequest.onAuthRequired.addListener( (details, callback) => { callback({ authCredentials: { username: "lznbghpe", password: "16z9hv6q9fhu" } }); }, {urls: ["<all_urls>"]}, ["blocking"] );
- 将上述两个文件打包为
proxy-auth-extension.zip,修改Java代码加载扩展:
public void start(){ ChromeOptions options = new ChromeOptions(); // 替换为你的扩展zip文件路径 File extensionFile = new File("path/to/proxy-auth-extension.zip"); options.addExtensions(extensionFile); options.addArguments("--headless"); options.addArguments("start-maximized"); // 禁用其他扩展,避免冲突 options.addArguments("--disable-extensions-except=" + extensionFile.getAbsolutePath()); WebDriver driver = new ChromeDriver(options); try { driver.get("https://mycgsportal.com/MyCGS/CGSAccount/Login"); System.out.println(driver.getTitle()); } finally { driver.quit(); } }
方法二:DevTools协议注入认证(无扩展方案)
适合ChromeDriver 75+版本,直接通过代码调用DevTools接口注入认证信息:
public void start(){ String proxyAddress = "130.185.126.159"; int proxyPort = 6774; String proxyUsername = "lznbghpe"; String proxyPassword = "16z9hv6q9fhu"; // 配置基础代理(不带认证) Proxy proxy = new Proxy(); proxy.setProxyType(Proxy.ProxyType.MANUAL); proxy.setHttpProxy(proxyAddress + ":" + proxyPort); proxy.setSslProxy(proxyAddress + ":" + proxyPort); ChromeOptions options = new ChromeOptions(); options.setProxy(proxy); options.addArguments("--headless"); options.addArguments("start-maximized"); // 无头模式必备参数,避免权限问题 options.addArguments("--no-sandbox"); options.addArguments("--disable-dev-shm-usage"); ChromeDriver driver = new ChromeDriver(options); try { // 启用Network域 driver.executeCdpCommand("Network.enable", new HashMap<>()); // 注入代理认证信息 Map<String, Object> authParams = new HashMap<>(); authParams.put("username", proxyUsername); authParams.put("password", proxyPassword); driver.executeCdpCommand("Network.setAuthCredentials", authParams); driver.get("https://mycgsportal.com/MyCGS/CGSAccount/Login"); System.out.println(driver.getTitle()); } finally { driver.quit(); } }
额外注意事项
- 确保ChromeDriver版本与本地Chrome浏览器版本完全匹配,版本不兼容会引发各类异常
- 检查代理服务器是否允许当前机器IP访问,部分代理会限制来源IP
- 无头模式下建议添加
--no-sandbox和--disable-dev-shm-usage参数,避免容器或低权限环境下的运行问题
内容的提问来源于stack exchange,提问作者Aleksandr
相关产品推荐
相关产品推荐

