org.openqa.selenium.remote.http.ConnectionFailedException:无法建立websocket连接 Selenium ChromeDriver和Chrome v111
我试着用Selenium和Chrome浏览器v111来调用该网站。
浏览器打开了,但网站没有调用。 它运行正常,但在更新chrome "版本111.0.5563.65(Official Build)(64-bit)"之后,我遇到了这个问题:
org.openqa.selenium.remote.http.ConnectionFailedException: Unable to establish websocket connection
我试了一下,Eclipse IDE for Enterprise Java Developers(包括孵化组件)版本:2020-12(4.18.0)Build id:20201210-1552。
这就是代码:
package com.testng.library_Files;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.annotations.Test;
public class one {
WebDriver driver=null;
@Test(priority = 1)
public void DoSetup()
{
//System.setProperty("webdriver.chrome.driver","./src/main/java/drivers/chromedriver.exe");
ChromeOptions options= new ChromeOptions();
options.setHeadless(true);
//driver= new ChromeDriver(options);
driver= new ChromeDriver();
}
@Test(priority = 2)
public void LaunchURL()
{
driver.get("https://www.google.com");
}
}
请帮助我解决这个问题。
使用google-chrome v111.0这个错误信息......
org.openqa.selenium.remote.http.ConnectionFailedException: Unable to establish websocket connection to http://localhost:49877/devtools/browser/3a3af47d-732a-4337-a91c-18c8ced545cd
和这一错误信息...
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
甚至还有这个错误信息...
java.lang.NullPointerException: Cannot invoke "org.asynchttpclient.ws.WebSocket.sendCloseFrame(int, String)" because "this.socket" is null
...是devtools_http_handler
拒绝来自http://localhost 原点的传入WebSocket连接的结果。
详细内容
这个问题是由于在Selenium目前使用的Netty 4.x中,设置的Origin
头被自动解析为无意义的值。这个问题在Origin header is always sent from WebSocket client中详细讨论过,并通过Fix generating the Origin header value for websocket handshake request解决。
解决方案
按照Selenium博客的说法,有几种方法可以解决这个问题。
使用 java-11 HTTP客户端在Selenium:Selenium使用HTTP客户端和相关的WebSocket客户端来实现多种目的。AsyncHttpClient是一个建立在Netty之上的开源库。它允许异步地执行HTTP请求和响应。但是AsyncHttpClient自2021年6月起不再维护,因为Java 11+提供了一个内置的HTTP和WebSocket客户端。Selenium可以利用它来取代AsyncHttpClient。
先决条件:
Project configured to use Java 11+ Using Selenium 4.5.0 as a minumum version
集成的Java 11+客户端:由于Java 11+ HTTP客户端位于它自己的工件中,它可以被导入到使用Java 11+的项目中,如下所示:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.5.0</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-http-jdk-client</artifactId> <version>4.5.0</version> </dependency>
设置系统属性:你需要设置系统属性以表明需要使用Java 11+ Http客户端。默认情况下,它使用AsyncHttpClient:
System.setProperty("webdriver.http.factory", "jdk-http-client");
使用java-8在Selenium:正如ChromeDriver verbose log所示:
[32332:259:0214/190812.204658:ERROR:devtools_http_handler.cc(766)] Rejected an incoming WebSocket connection from the http://localhost:58642 origin. Use the command line flag --remote-allow-origins=http://localhost:58642 to allow connections from this origin or --remote-allow-origins=* to allow all origins.
快速解决这个问题的方法是添加参数--remote-allow-origins=*
,如下所示:
Java:
ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); WebDriver driver = new ChromeDriver(options);
参考文献
与有用的参考资料的链接:
我是按照下面的答案来的:https://stackoverflow.com/a/75703971/21386874
options.addArguments("--remote-allow-origins=*");
在我的项目中,我得到了以下的错误:
错误:
org.openqa.selenium.remote.http.ConnectionFailedException: Unable to establish websocket connection to http://localhost:49877/devtools/browser/3a3af47d-732a-4337-a91c-18c8ced545cd Build info: version: '4.5.3', revision: '4b786a1e430'
答案是:
我下载了最新的chromedriver.exe,版本为111.0.5563.64。 另外,我还增加了一个依赖项:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-http-jdk-client</artifactId>
<version>4.5.0</version>
</dependency>
并在第一行添加了这行代码到@BeforeTest
方法中:
System.setProperty("webdriver.http.factory", "jdk-http-client");
ChromeOptions options=new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
//Launching the browser
driver=new ChromeDriver(options);
我在不同的版本中都面临着同样的错误,这对我来说已经解决了。问题可能出在java、selenium和testNG版本的兼容性上。你可以尝试使用java 11,selenium版本为4.5或以上,testNG版本为7.5。
我下载了ChromeDriver 111.0.5563.64版本&的chromedriver_win32.zip;在工作区,我添加了以下代码。
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver driver = new ChromeDriver(options);
在这个问题解决之后