解决 Selenium WebDriver 的 403 Forbidden 错误
问题描述
使用 Selenium WebDriver 在 Azure DevOps 中执行测试时,可能遇到以下错误:
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 连接被拒绝,导致自动化测试失败。
错误原因:
- Chrome 浏览器 111+ 版本增加了安全性限制
- WebSocket 请求被
devtools_http_handler
拦截 - ChromeDriver 的 CORS 策略阻止了跨源连接
解决方案
✔️ 方案1:添加远程允许来源参数(推荐)
在 Chrome 选项中添加 --remote-allow-origins=*
参数允许所有来源的 WebSocket 连接:
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+):
<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 客户端可绕过此问题:
添加 Maven 依赖:
xml<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-http-jdk-client</artifactId> <version>4.8.1</version> </dependency>
设置系统属性:
javaSystem.setProperty("webdriver.http.factory", "jdk-http-client");
特定框架解决方案
🔸 使用 Selenide 时
升级 Selenide 至 6.12.2+ 版本:
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide</artifactId>
<version>6.12.2</version>
</dependency>
🔸 兼容旧版 Chrome
临时使用 Chrome v110 + ChromeDriver v110(不推荐):
- 下载兼容的 ChromeDriver
- 设置浏览器强制使用指定版本:java
System.setProperty("webdriver.chrome.driver", "/path/chromedriver_110");
完整配置示例
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");
}
}
@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 安全策略升级:
- Chromium 111+ 开始严格验证 WebSocket Origin
- 本地调试时浏览器运行在
localhost
被允许 - 远程环境(如Azure DevOps)被识别为跨源请求
- 默认禁止来自
localhost:<port>
的连接
重要
403 错误不代表认证问题,而是 Chrome 强制执行的 CORS 策略导致的 WebSocket 连接拒绝
总结
要彻底解决 Selenium WebDriver 的 403 错误:
- 首选方案:所有环境添加
--remote-allow-origins=*
参数 - 长期方案:升级到 Selenium 4.9.0+(JDK 8项目)或切换到 Java 11 HTTP 客户端
- 框架用户:保持 Selenide 等框架最新版本
使用本文方案后,自动化测试应能在 Azure DevOps 等远程环境中稳定运行,不再出现因 WebSocket 连接被拒导致的 Java.io.IOException 异常。