org.openqa.selenium.remote.http.ConnectionFailedException:无法建立websocket连接 Selenium ChromeDriver和Chrome v111

回答 5 浏览 5432 2023-03-13

我试着用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");
     }
 }

请帮助我解决这个问题。

JBM 提问于2023-03-13
什么问题?"什么问题?Rolandas Ulevicius 2023-03-13
5 个回答
#1楼
得票数 8

使用 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博客的说法,有几种方法可以解决这个问题。

  • 使用 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");
      
  • 使用在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);
    

参考文献

与有用的参考资料的链接:

undetected Selenium 提问于2023-03-15
undetected Selenium 修改于2023-03-16
#2楼 已采纳
得票数 6

我是按照下面的答案来的: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");
JBM 提问于2023-03-13
Tyler2P 修改于2023-03-18
#3楼
得票数 4
ChromeOptions options=new ChromeOptions();    
options.addArguments("--remote-allow-origins=*");    
//Launching the browser
driver=new ChromeDriver(options);
Bhairu 提问于2023-03-13
General Grievance 修改于2023-03-13
#4楼
得票数 0

我在不同的版本中都面临着同样的错误,这对我来说已经解决了。问题可能出在java、selenium和testNG版本的兼容性上。你可以尝试使用java 11,selenium版本为4.5或以上,testNG版本为7.5。

Nitee Asswani 提问于2023-03-20
#5楼
得票数 0

我下载了ChromeDriver 111.0.5563.64版本&的chromedriver_win32.zip;在工作区,我添加了以下代码。

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

在这个问题解决之后

B.Harish Kumar 提问于2023-03-25