Skip to content

解决 Selenium WebDriver 的 403 Forbidden 错误

问题描述

使用 Selenium WebDriver 在 Azure DevOps 中执行测试时,可能遇到以下错误:

java
2023-03-08T21:06:50.3292859Z Mar 08, 2023 4:06:50 PM org.openqa.selenium.remote.http.WebSocket$Listener onError
2023-03-08T21:06:50.3319163Z WARNING: Invalid Status code=403 text=Forbidden
2023-03-08T21:06:50.3320374Z java.io.IOException: Invalid Status code=403 text=Forbidden

注意

该错误通常发生在 Chrome v111+ 环境中,本地运行可能正常但远程服务器(如 Azure DevOps)会出现异常。核心问题是 WebSocket 连接被拒绝,导致自动化测试失败。

错误原因:

  1. Chrome 浏览器 111+ 版本增加了安全性限制
  2. WebSocket 请求被 devtools_http_handler 拦截
  3. ChromeDriver 的 CORS 策略阻止了跨源连接

解决方案

✔️ 方案1:添加远程允许来源参数(推荐)

在 Chrome 选项中添加 --remote-allow-origins=* 参数允许所有来源的 WebSocket 连接:

java
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver driver = new ChromeDriver(options);

最佳实践

  • 确保 ChromeDriver 版本与 Chrome 浏览器兼容
  • 在设置属性时添加该参数:
    java
    ChromeOptions option = new ChromeOptions();
    option.addArguments("--remote-allow-origins=*");
    
    System.setProperty("webdriver.chrome.driver", path);
    WebDriver driver = new ChromeDriver(option);

方案2:升级 Selenium 版本

升级到 Selenium 4.9.0+ 可原生解决此问题(需 JDK 8+):

xml
<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-java</artifactId>
  <version>4.9.0</version>
</dependency>

注意

此方案仅适用于 Java 11 以下环境。JDK 8项目必须升级到 4.9.0 或更高版本

方案3:使用 Java 11+ HTTP 客户端

对于 Java 11+ 项目,使用 JDK 原生 HTTP 客户端可绕过此问题:

  1. 添加 Maven 依赖:

    xml
    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-http-jdk-client</artifactId>
      <version>4.8.1</version>
    </dependency>
  2. 设置系统属性:

    java
    System.setProperty("webdriver.http.factory", "jdk-http-client");

特定框架解决方案

🔸 使用 Selenide 时

升级 Selenide 至 6.12.2+ 版本:

xml
<dependency>
  <groupId>com.codeborne</groupId>
  <artifactId>selenide</artifactId>
  <version>6.12.2</version>
</dependency>

🔸 兼容旧版 Chrome

临时使用 Chrome v110 + ChromeDriver v110(不推荐):

  1. 下载兼容的 ChromeDriver
  2. 设置浏览器强制使用指定版本:
    java
    System.setProperty("webdriver.chrome.driver", "/path/chromedriver_110");

完整配置示例

java
public class ChromeSetupExample {
    public static void main(String[] args) {
        // 方案1
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        
        // 方案3(可选)
        System.setProperty("webdriver.http.factory", "jdk-http-client");
        
        WebDriver driver = new ChromeDriver(options);
        driver.get("https://example.com");
    }
}
java
@Test
public void testCase() {
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--remote-allow-origins=*", "ignore-certificate-errors");
    WebDriver driver = new ChromeDriver(options);
    
    // 测试逻辑
    driver.get("https://selenium.dev/");
    Assert.assertEquals(driver.getTitle(), "Selenium");
}

解决方案对比表

方案适用条件优势缺点
添加 --remote-allow-origins=*所有 Java 版本简单快速,无需升级安全性略低
升级 Selenium (4.9.0+)JDK 8 项目官方解决方案需调整依赖
Java 11 HTTP 客户端JDK 11+使用标准库JDK 版本限制
降级 Chrome临时方案快速验证不推荐长期使用

根本原因分析

此问题源于 Chromium 安全策略升级

  1. Chromium 111+ 开始严格验证 WebSocket Origin
  2. 本地调试时浏览器运行在 localhost 被允许
  3. 远程环境(如Azure DevOps)被识别为跨源请求
  4. 默认禁止来自 localhost:<port> 的连接

重要

403 错误不代表认证问题,而是 Chrome 强制执行的 CORS 策略导致的 WebSocket 连接拒绝

总结

要彻底解决 Selenium WebDriver 的 403 错误:

  1. 首选方案:所有环境添加 --remote-allow-origins=* 参数
  2. 长期方案:升级到 Selenium 4.9.0+(JDK 8项目)或切换到 Java 11 HTTP 客户端
  3. 框架用户:保持 Selenide 等框架最新版本

使用本文方案后,自动化测试应能在 Azure DevOps 等远程环境中稳定运行,不再出现因 WebSocket 连接被拒导致的 Java.io.IOException 异常。