Karate UI脚本握手失败求助:WebSocket握手返回403 Forbidden
Karate UI Chrome驱动WebSocket握手403 Forbidden问题解决
问题重现
Feature文件代码
Background configure cors = true configure driver = {type: 'chrome', executable: 'chrome', addOptions: '\[*--remote-allow-origins=*\]} Scenario: User goes to Angular Given driver 'https://angular.io' And fullscreen() Then assert locate('.nav-link.home').exists
错误信息
org.opentest4j.AssertionFailedError: driver config / start failed: io.netty.handler.codec.http.websocketx.WebSocketClientHandshakeException: Invalid handshake response getStatus: 403 Forbidden, options: {type=chrome, target=null} classpath:features/testing.feature:8 at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:38) at org.junit.jupiter.api.Assertions.fail(Assertions.java:135) at com.intuit.karate.junit5.FeatureNode.lambda$next$1(FeatureNode.java:86)
解决方案
1. 修正驱动配置的语法错误
原配置中addOptions的写法存在转义字符和语法错误,导致Chrome启动参数未被正确解析,这是引发握手失败的核心原因之一。修正后的配置如下:
configure driver = {type: 'chrome', executable: 'chrome', addOptions: ['--remote-allow-origins=*']}
- 移除多余的转义符
\,使用标准数组格式传递启动参数 - 确保引号、括号配对正确
2. 确保Chrome浏览器与ChromeDriver版本匹配
Karate会自动下载对应版本的ChromeDriver,但本地存在不兼容驱动时,会导致WebSocket通信异常:
- 查看Chrome浏览器版本(访问
chrome://version/) - 确认Karate下载的ChromeDriver版本与浏览器主版本号完全一致
- 若版本不匹配,手动下载对应版本的ChromeDriver并指定路径,或清理Karate缓存的驱动文件
3. 添加额外的Chrome启动参数(按需使用)
针对测试环境的安全限制,可添加以下参数放宽Chrome安全策略:
configure driver = {type: 'chrome', executable: 'chrome', addOptions: ['--remote-allow-origins=*', '--no-sandbox', '--disable-dev-shm-usage', '--disable-web-security']}
--no-sandbox:禁用沙箱模式,解决部分环境下的权限问题--disable-dev-shm-usage:避免Docker或低内存环境下的资源不足问题--disable-web-security:放宽跨域安全限制(仅用于测试环境)
4. 排查网络与代理问题
如果测试环境使用代理,可能会拦截WebSocket握手请求导致403:
- 检查代理是否允许ws/wss协议请求
- 在Chrome启动参数中添加代理配置,例如:
--proxy-server=http://your-proxy:port - 若无需代理,添加
--no-proxy-server参数跳过代理
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

