ChromeDriver在Selenium中运行失败求助:WebSocket连接403错误
Selenium ChromeDriver WebSocket 403 Forbidden 问题解决
问题详情
使用Google Chrome 112.0.5615.138(64位官方版)、ChromeDriver 112.0.5615.49,运行Selenium Java代码时出现错误。日志先显示SLF4J无提供者警告,ChromeDriver启动成功后触发WebSocket连接403 Forbidden错误,最终抛出ConnectionFailedException。此前代码可正常运行,需解决该问题。
错误日志
SLF4J: No SLF4J providers were found. SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details. Starting ChromeDriver 112.0.5615.49 (bd2a7bcb881c11e8cfe3078709382934e3916914-refs/branch-heads/5615@{#936}) on port 9583 Only local connections are allowed. Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe. ChromeDriver was started successfully. Apr 25, 2023 3:22:19 PM org.openqa.selenium.remote.http.WebSocket$Listener onError WARNING: Invalid Status code=403 text=Forbidden java.io.IOException: Invalid Status code=403 text=Forbidden at org.asynchttpclient.netty.handler.WebSocketHandler.abort(WebSocketHandler.java:92) at org.asynchttpclient.netty.handler.WebSocketHandler.handleRead(WebSocketHandler.java:118) at org.asynchttpclient.netty.handler.AsyncHttpClientHandler.channelRead(AsyncHttpClientHandler.java:78) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:336) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:280) at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:833) Exception in thread "main" org.openqa.selenium.remote.http.ConnectionFailedException: Unable to establish websocket connection to http://localhost:54056/devtools/browser/d72dbc58-f7b2-4cf2-8704-d7a47660caa7 Build info: version: '4.7.2', revision: '4d4020c3b7' System info: os.name: 'Windows 11', os.arch: 'amd64', os.version: '10.0', java.version: '17.0.5' Driver info: driver.version: ChromeDriver at org.openqa.selenium.remote.http.netty.NettyWebSocket.<init>(NettyWebSocket.java:102) at org.openqa.selenium.remote.http.netty.NettyWebSocket.lambda$create$3(NettyWebSocket.java:128) at org.openqa.selenium.remote.http.netty.NettyClient.openSocket(NettyClient.java:107) at org.openqa.selenium.devtools.Connection.<init>(Connection.java:78) at org.openqa.selenium.chromium.ChromiumDriver.lambda$new$2(ChromiumDriver.java:116) at java.base/java.util.Optional.map(Optional.java:260) at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:114) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:82) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:50) at TestCase5.main(TestCase5.java:10)
运行代码
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class TestCase5 { public static void main(String[] args) { // TODO Auto-generated method stub System.setProperty("webdriver.chrome.driver", "D:\\Webdrivers\\chromedriver_win32\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://login.salesforce.com/"); // Create customized CSS from HTML attributes driver.findElement(By.cssSelector("input[name=\"username\"]")).sendKeys("shomnath@gmail.com"); driver.findElement(By.cssSelector("input[type=\"password\"]")).sendKeys("12314546"); driver.findElement(By.cssSelector("[type=\"submit\"]")).click(); } }
解决方案
1. 检查代理设置
系统或Chrome的代理可能拦截WebSocket连接:
- 关闭Chrome代理:打开Chrome设置→系统→打开计算机代理设置,确保代理已禁用。
- 确保代码中未配置代理,避免Selenium通过代理连接本地ChromeDriver。
2. 升级Selenium版本
当前Selenium 4.7.2可能存在与ChromeDriver 112的兼容性问题,升级到4.10.0及以上稳定版可修复部分WebSocket连接异常。
3. 添加ChromeOptions参数
初始化ChromeDriver时添加以下参数,绕过安全限制:
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class TestCase5 { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "D:\\Webdrivers\\chromedriver_win32\\chromedriver.exe"); ChromeOptions options = new ChromeOptions(); options.addArguments("--no-sandbox"); options.addArguments("--remote-allow-origins=*"); options.addArguments("--ignore-certificate-errors"); WebDriver driver = new ChromeDriver(options); driver.get("https://login.salesforce.com/"); driver.findElement(By.cssSelector("input[name=\"username\"]")).sendKeys("shomnath@gmail.com"); driver.findElement(By.cssSelector("input[type=\"password\"]")).sendKeys("12314546"); driver.findElement(By.cssSelector("[type=\"submit\"]")).click(); } }
4. 排查杀毒/防火墙软件
临时关闭杀毒软件或防火墙,测试是否是此类工具拦截了本地WebSocket连接。
5. 清理Chrome缓存与配置
关闭Chrome后,删除用户数据目录(默认路径:C:\Users\<用户名>\AppData\Local\Google\Chrome\User Data),再重新启动Chrome和测试代码。
内容的提问来源于stack exchange,提问作者Shomnath Somu
相关产品推荐
相关产品推荐

