Selenium与BrowserMob无法连接HTTPS端口问题求助
问题分析
你的代码在HTTP环境下正常运行,但HTTPS环境中浏览器报ERR_PROXY_CONNECTION_FAILED错误,结合curl能正常访问的情况,核心问题大概率是BrowserMobProxy连接外部HTTPS代理时未指定正确协议,同时存在部分冗余配置导致冲突。
解决方案
以下是针对性的代码修改和配置调整:
1. 指定链式代理的HTTPS协议
BrowserMobProxy默认用HTTP协议连接链式代理,但你的外部代理是HTTPS类型,必须显式指定协议:
在setChainedProxy后添加一行代码:
proxy.setChainedProxyProtocol(ProxyProtocol.HTTPS);
2. 移除冗余的代理配置
ClientUtil.createSeleniumProxy(proxy)已经自动生成包含HTTP和HTTPS代理的完整配置,无需手动调用setHttpProxy和setSslProxy,重复设置会导致配置冲突。
3. 添加Chrome必要启动参数
为Chrome添加忽略代理证书错误的参数,避免MITM(中间人)过程中的SSL验证拦截:
options.addArguments("--ignore-certificate-errors"); options.addArguments("--ignore-ssl-errors");
修改后的完整代码
implementation 'org.seleniumhq.selenium:selenium-java:4.5.0' implementation 'net.lightbody.bmp:browsermob-core:2.1.5' public static BrowserMobProxyServer createLocalProxy(String hostname, String port, String username, String password) { BrowserMobProxyServer proxy = new BrowserMobProxyServer(); // 信任所有服务器 proxy.setTrustAllServers(true); // 设置链式代理地址 proxy.setChainedProxy(new InetSocketAddress(hostname, Integer.parseInt(port))); // 指定链式代理为HTTPS协议 proxy.setChainedProxyProtocol(ProxyProtocol.HTTPS); // 设置链式代理基础认证 proxy.chainedProxyAuthorization(username, password, AuthType.BASIC); // 配置MITM管理器 proxy.setMitmManager(ImpersonatingMitmManager.builder().trustAllServers(true).build()); // 启动本地代理(自动分配端口) proxy.start(0); return proxy; } // 代理设置 BrowserMobProxy proxy = createLocalProxy("<proxy hostname>", "<proxy HTTPS port>", "<user name>", "<password>"); // 由ClientUtil自动生成正确的Selenium代理配置 Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); // 添加Chrome必要参数 options.addArguments("--ignore-certificate-errors"); options.addArguments("--ignore-ssl-errors"); options.setProxy(seleniumProxy); WebDriver driver = new ChromeDriver(options);
额外验证点
- 确认外部代理端口为HTTPS专用端口(通常是443或自定义SSL端口),不要与HTTP端口混淆。
- 可添加BrowserMobProxy日志排查连接问题:
// 在创建proxy后添加日志配置 LoggingHandler loggingHandler = new LoggingHandler(Level.INFO); proxy.addLastHttpFilterFactory(new LoggingFilter(loggingHandler)); proxy.addLastHttpsFilterFactory(new LoggingFilter(loggingHandler));
内容的提问来源于stack exchange,提问作者ykg
相关产品推荐
相关产品推荐

