页面一直加载不出来,运行超时
检查 首次导航是不是普通的 driver.get(),而代理正在等登录?
处理 先注册处理器,再用 BrowsingContext.navigate 打开首个页面;Python 测试里普通 get 也出现过同样的卡住。
代理地址写进选项,账号密码交给认证处理器。本页讲清原因,并给出 Chrome、Edge、Firefox 的 Java 写法。
Selenium 的 Proxy 类只接受 HTTP 和 SSL 的 host:port;它唯一的用户名、密码字段是给 SOCKS v5 的。Chrome 同样不使用写在代理设置里的账号密码,对 SOCKS5 也不支持任何登录方式。所以把 http://LOGIN:PASSWORD@HOST:PORT 写进参数或 Proxy 里并不会登录,没人盯着的窗口只会失败。
代理实际会返回 407 登录挑战。WebDriver BiDi 规范规定:状态码 407 时从 Proxy-Authenticate 取挑战,所以 BiDi 的认证处理器可以回答它。Selenium Java 通过 bidi.module.Network 类提供了这个能力。
| 项目 | 能处理登录吗? | 说明 |
|---|---|---|
| Proxy 对象 + setHttpProxy | 不能 | 只设地址;Javadoc 里没有 HTTP 代理的登录字段 |
| --proxy-server=http://LOGIN:PASSWORD@HOST:PORT | 不能 | Chrome 不使用嵌在代理设置里的账号密码 |
| BiDi Network:onAuthRequired + continueWithAuth | 能,设计上就是为此 | BiDi 规范覆盖 407 挑战;请在你的 Selenium 和浏览器版本上先跑一遍 |
| HasAuthentication.register(...) | 文档没写适用于代理 | Javadoc 讲的是向网站认证,没有提代理;依赖前先自己测试 |
| 补上登录信息的本地转发器 | 能 | Chrome 连 127.0.0.1,不需要登录;多一个要运行的进程 |
来源:Selenium Javadoc 与源码、W3C BiDi 规范和 Chromium 的代理说明,2026 年 11 月 14 日阅读。
import org.openqa.selenium.By;
import org.openqa.selenium.UsernameAndPassword;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.ReadinessState;
import org.openqa.selenium.bidi.module.Network;
import org.openqa.selenium.bidi.network.AddInterceptParameters;
import org.openqa.selenium.bidi.network.InterceptPhase;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions; // for Edge use org.openqa.selenium.edge.EdgeOptions / EdgeDriver
public class ProxyLogin {
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions();
options.enableBiDi(); // the login handler runs over WebDriver BiDi
options.addArguments("--proxy-server=http://HOST:2222"); // no LOGIN:PASSWORD in the address
WebDriver driver = new ChromeDriver(options);
try (Network network = new Network(driver)) {
network.addIntercept(new AddInterceptParameters(InterceptPhase.AUTH_REQUIRED));
network.onAuthRequired(details ->
network.continueWithAuth(
details.getRequest().getRequestId(),
new UsernameAndPassword("LOGIN", "PASSWORD")));
// open the first page over BiDi, as the Selenium project's own test does
BrowsingContext context = new BrowsingContext(driver, driver.getWindowHandle());
context.navigate("https://api.ipify.org?format=json", ReadinessState.COMPLETE);
System.out.println(driver.findElement(By.tagName("body")).getText()); // the proxy's exit IP
} finally {
driver.quit();
}
}
}API 名称已对照 2026 年 11 月 14 日的 Selenium 源码;代码没有在撰写时的机器上编译。同一流程的 Python 版在 2026 年 10 月 18 日测试过。请把 HOST、LOGIN、PASSWORD 换成「我的资产」里的值。
import org.openqa.selenium.Proxy;
import org.openqa.selenium.firefox.FirefoxOptions;
Proxy proxy = new Proxy();
proxy.setHttpProxy("HOST:2222"); // host:port only; Proxy has no login for an HTTP proxy
proxy.setSslProxy("HOST:2222");
FirefoxOptions options = new FirefoxOptions();
options.setProxy(proxy);
options.enableBiDi();
// then create the driver and register the same auth handler as in the Chrome exampleFirefox 通过标准的 proxy 能力接收代理。FirefoxOptions 有 enableBiDi();Selenium 自己的认证测试并不限于 Chrome,但我们只在 Chrome 上跑过代理登录流程。未编译。
写在浏览器选项里的代理会传给 Selenium Manager,它下载驱动和浏览器时也会用,而且不带密码。如果首次运行在下载驱动时报 407,对 Chrome 和 Edge 请像上面的代码那样用 --proxy-server 参数,或者用 SE_PROXY 给 Selenium Manager 另设一个代理。Proxy302 在 2026 年 10 月 18 日的 Python 测试就遇到过这个问题,并用参数方式避开了。
先在 Selenium 之外测试登录:curl -x http://LOGIN:PASSWORD@HOST:2222 https://ipinfo.io/json 应该打印出代理的 IP。
预期结果 输出代理出口 IP 的 JSON。
用 enableBiDi() 启动驱动,把 host:port 写在参数或 Proxy 里,不要带登录信息。
在打开首个页面之前注册处理器,并用 BrowsingContext.navigate 打开这个页面。
打印页面内容,把 IP 和国家与你自己的对比。
预期结果 显示代理的 IP,而不是你自己的。
检查 首次导航是不是普通的 driver.get(),而代理正在等登录?
处理 先注册处理器,再用 BrowsingContext.navigate 打开首个页面;Python 测试里普通 get 也出现过同样的卡住。
检查 调用了 enableBiDi() 吗?处理器是在打开页面之前注册的吗?账号密码对吗?
处理 先用 curl 测试,再检查调用顺序。
检查 代理是不是通过 Proxy 或 options 设的,导致 Selenium Manager 也在用它?
处理 Chrome 和 Edge 用 --proxy-server 参数,或者用 SE_PROXY,或者用本地已有的驱动。
检查 地址是不是 host:port 的形式,协议是不是 HTTP、端口 2222?
处理 改对地址,重启驱动,再打印出口 IP。
停止条件 如果用同一个代理 curl 也失败,就别再改 Selenium 代码,去检查账号信息。
不登录账号的测试和 Grid,可以按 IP 租机房 IP:1 天 US$0.25,30 天 US$3.99,一次最多 100 个;协议选 HTTP,即 proxy.proxy302.com 的 2222 端口。机房 IP 能被识别为机房地址,所以涉及账号、店铺的工作请选静态 ISP IP,每天 US$0.50 起。
没有免费试用,最小的购买是 1 个 IP 用 1 天。
把 host:port 放进 ChromeOptions(--proxy-server)或 FirefoxOptions(Proxy),调用 enableBiDi(),再用 Network.onAuthRequired 和 continueWithAuth 回答登录。
不接受。Chrome 对 SOCKS5 不支持任何认证方式,请改用 HTTP 代理或本地转发器。
它的 Javadoc 讲的是向网站认证,没有提代理,所以在你的版本上先测试再依赖。
选项里的代理也会被 Selenium Manager 用来下载驱动,而且不带密码。Chrome 和 Edge 请用参数方式,或设 SE_PROXY。
官方文档 · 确认日期:
2026 年 11 月 14 日读:setHttpProxy、setSslProxy 接受 host:port;有 setSocksUsername、setSocksPassword,仅 SOCKS v5 支持;这个类没有 HTTP 代理的登录字段。
官方文档 · 确认日期:
2026 年 11 月 14 日读:Java 示例创建 Proxy,调用 setHttpProxy("myproxy.com:8080"),再作为 "proxy" 能力设到 options 上。
官方文档 · 确认日期:
2026 年 11 月 14 日读:该接口让驱动能向网站做认证;ChromeDriver、ChromiumDriver、EdgeDriver、ElectronDriver 实现了它;页面没有提到代理认证。
官方文档 · 确认日期:
2026 年 11 月 14 日读(trunk):Network 有 addIntercept、onAuthRequired、continueWithAuth(requestId, UsernameAndPassword);InterceptPhase 有 AUTH_REQUIRED;ChromiumOptions 和 FirefoxOptions 有 enableBiDi()(设置 webSocketUrl);项目自己的测试在要求基本认证的页面上注册认证处理并用 BrowsingContext.navigate(url, COMPLETE) 导航,没有排除任何浏览器。
官方文档 · 确认日期:
2026 年 11 月 14 日读:状态码 401 时从 WWW-Authenticate 取挑战,状态码 407 时从 Proxy-Authenticate 取,所以 authRequired 事件也可以覆盖代理登录。
官方文档 · 确认日期:
2026 年 11 月 14 日读:Chrome 不使用嵌在代理设置里的账号密码;HTTP 代理走普通登录流程(Basic、Digest、Negotiate、NTLM);SOCKS5 不支持任何认证方式。
官方文档 · 确认日期:
2026 年 11 月 14 日读:浏览器选项里设的代理会传给 Selenium Manager,浏览器和下载驱动、浏览器时都会使用;SE_PROXY 可单独给 Selenium Manager 设另一个代理。
本地示例 · 确认日期:
本站 Selenium 用例页记录了 2026 年 10 月 18 日的 Python 实测(Selenium 4.41.0 与 4.51.0,ChromeDriver 153),经过一个带密码的本地代理:开启 BiDi、用 --proxy-server 参数设代理后,BiDi 认证处理成功加载了 HTTP 和 HTTPS 页面。本页的 Java 代码没有编译或运行过。
是 Python,不是 Java,属于另一种语言绑定。
产品观察 · 确认日期:
网站产品信息表(2026 年 11 月 10 日核对):协议与端口、美元价格(1 PTC = US$1)、租期、数量上限、无免费试用。
注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。