跳到正文

Selenium Java 代理账号密码认证

代理地址写进选项,账号密码交给认证处理器。本页讲清原因,并给出 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 类提供了这个能力。

给 Selenium 配代理登录的几种办法

给 Selenium 配代理登录的几种办法
项目能处理登录吗?说明
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 日阅读。

Chrome 和 Edge:参数加 BiDi 登录处理器

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 换成「我的资产」里的值。

Firefox:Proxy 对象,再用同一个处理器

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 example

Firefox 通过标准的 proxy 能力接收代理。FirefoxOptions 有 enableBiDi();Selenium 自己的认证测试并不限于 Chrome,但我们只在 Chrome 上跑过代理登录流程。未编译。

Selenium Manager 与首次运行

写在浏览器选项里的代理会传给 Selenium Manager,它下载驱动和浏览器时也会用,而且不带密码。如果首次运行在下载驱动时报 407,对 Chrome 和 Edge 请像上面的代码那样用 --proxy-server 参数,或者用 SE_PROXY 给 Selenium Manager 另设一个代理。Proxy302 在 2026 年 10 月 18 日的 Python 测试就遇到过这个问题,并用参数方式避开了。

四步检查

  1. 第 1 步

    先在 Selenium 之外测试登录:curl -x http://LOGIN:PASSWORD@HOST:2222 https://ipinfo.io/json 应该打印出代理的 IP。

    预期结果 输出代理出口 IP 的 JSON。

  2. 第 2 步

    用 enableBiDi() 启动驱动,把 host:port 写在参数或 Proxy 里,不要带登录信息。

  3. 第 3 步

    在打开首个页面之前注册处理器,并用 BrowsingContext.navigate 打开这个页面。

  4. 第 4 步

    打印页面内容,把 IP 和国家与你自己的对比。

    预期结果 显示代理的 IP,而不是你自己的。

常见问题与检查项

页面一直加载不出来,运行超时

检查 首次导航是不是普通的 driver.get(),而代理正在等登录?

处理 先注册处理器,再用 BrowsingContext.navigate 打开首个页面;Python 测试里普通 get 也出现过同样的卡住。

407 Proxy Authentication Required

检查 调用了 enableBiDi() 吗?处理器是在打开页面之前注册的吗?账号密码对吗?

处理 先用 curl 测试,再检查调用顺序。

首次运行下载驱动失败

检查 代理是不是通过 Proxy 或 options 设的,导致 Selenium Manager 也在用它?

处理 Chrome 和 Edge 用 --proxy-server 参数,或者用 SE_PROXY,或者用本地已有的驱动。

显示的还是你自己的 IP

检查 地址是不是 host:port 的形式,协议是不是 HTTP、端口 2222?

处理 改对地址,重启驱动,再打印出口 IP。

停止条件 如果用同一个代理 curl 也失败,就别再改 Selenium 代码,去检查账号信息。

Selenium Java 该选哪种 Proxy302 IP

不登录账号的测试和 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 天。

常见问题

Selenium Java 怎么设置带账号密码的代理?

把 host:port 放进 ChromeOptions(--proxy-server)或 FirefoxOptions(Proxy),调用 enableBiDi(),再用 Network.onAuthRequired 和 continueWithAuth 回答登录。

能把登录信息写进 Proxy 对象吗?

HTTP 代理在 Javadoc 里没有登录字段;用户名和密码只有 SOCKS v5 才有。

Chrome 接受 socks5://LOGIN:PASSWORD@HOST:PORT 吗?

不接受。Chrome 对 SOCKS5 不支持任何认证方式,请改用 HTTP 代理或本地转发器。

HasAuthentication 对代理有效吗?

它的 Javadoc 讲的是向网站认证,没有提代理,所以在你的版本上先测试再依赖。

为什么首次运行在打开任何页面前就报 407?

选项里的代理也会被 Selenium Manager 用来下载驱动,而且不带密码。Chrome 和 Edge 请用参数方式,或设 SE_PROXY。

参考资料

9
  1. Selenium Java API:Proxy

    官方文档 · 确认日期:

    2026 年 11 月 14 日读:setHttpProxy、setSslProxy 接受 host:port;有 setSocksUsername、setSocksPassword,仅 SOCKS v5 支持;这个类没有 HTTP 代理的登录字段。

  2. Selenium 文档:驱动选项(proxy)

    官方文档 · 确认日期:

    2026 年 11 月 14 日读:Java 示例创建 Proxy,调用 setHttpProxy("myproxy.com:8080"),再作为 "proxy" 能力设到 options 上。

  3. Selenium Java API:HasAuthentication

    官方文档 · 确认日期:

    2026 年 11 月 14 日读:该接口让驱动能向网站做认证;ChromeDriver、ChromiumDriver、EdgeDriver、ElectronDriver 实现了它;页面没有提到代理认证。

  4. Selenium 源码:bidi.module.Network 及其测试

    官方文档 · 确认日期:

    2026 年 11 月 14 日读(trunk):Network 有 addIntercept、onAuthRequired、continueWithAuth(requestId, UsernameAndPassword);InterceptPhase 有 AUTH_REQUIRED;ChromiumOptions 和 FirefoxOptions 有 enableBiDi()(设置 webSocketUrl);项目自己的测试在要求基本认证的页面上注册认证处理并用 BrowsingContext.navigate(url, COMPLETE) 导航,没有排除任何浏览器。

  5. W3C WebDriver BiDi:network 模块

    官方文档 · 确认日期:

    2026 年 11 月 14 日读:状态码 401 时从 WWW-Authenticate 取挑战,状态码 407 时从 Proxy-Authenticate 取,所以 authRequired 事件也可以覆盖代理登录。

  6. Chromium 文档:Chrome 的代理支持

    官方文档 · 确认日期:

    2026 年 11 月 14 日读:Chrome 不使用嵌在代理设置里的账号密码;HTTP 代理走普通登录流程(Basic、Digest、Negotiate、NTLM);SOCKS5 不支持任何认证方式。

  7. Selenium 文档:Selenium Manager

    官方文档 · 确认日期:

    2026 年 11 月 14 日读:浏览器选项里设的代理会传给 Selenium Manager,浏览器和下载驱动、浏览器时都会使用;SE_PROXY 可单独给 Selenium Manager 设另一个代理。

  8. Proxy302 对同一流程的 Python 实测,2026-10-18

    本地示例 · 确认日期:

    本站 Selenium 用例页记录了 2026 年 10 月 18 日的 Python 实测(Selenium 4.41.0 与 4.51.0,ChromeDriver 153),经过一个带密码的本地代理:开启 BiDi、用 --proxy-server 参数设代理后,BiDi 认证处理成功加载了 HTTP 和 HTTPS 页面。本页的 Java 代码没有编译或运行过。

    是 Python,不是 Java,属于另一种语言绑定。

  9. Proxy302 产品信息与价格表

    产品观察 · 确认日期:

    网站产品信息表(2026 年 11 月 10 日核对):协议与端口、美元价格(1 PTC = US$1)、租期、数量上限、无免费试用。

准备好试试了吗?

注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。