错误描述
在使用chromedriver的时候发现如下报错
java.lang.IllegalArgumentException: No WebSocketUpgradeHandler but scheme is ws
at org.asynchttpclient.netty.request.NettyRequestSender.validateWebSocketRequest(NettyRequestSender.java:577)
at org.asynchttpclient.netty.request.NettyRequestSender.sendRequest(NettyRequestSender.java:95)
at org.asynchttpclient.DefaultAsyncHttpClient.executegPmIvOBp(DefaultAsyncHttpClient.java:259)
at org.asynchttpclient.DefaultAsyncHttpClient.executegPmIvOBp
P9Gq6idG(DefaultAsyncHttpClient.java)
at org.asynchttpclient.DefaultAsyncHttpClientV5w3vlRG.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInterWithOverrideArgs.intercept(InstMethodsInterWithOverrideArgs.java:85)
at org.asynchttpclient.DefaultAsyncHttpClient.execute(DefaultAsyncHttpClient.java)
at org.asynchttpclient.DefaultAsyncHttpClient.executeRequest(DefaultAsyncHttpClient.java:228)
at org.asynchttpclient.BoundRequestBuilder.execute(BoundRequestBuilder.java:35)
at org.openqa.selenium.remote.http.netty.NettyWebSocket.<init>(NettyWebSocket.java:66)
at org.openqa.selenium.remote.http.netty.NettyWebSocket.lambda3(NettyWebSocket.java:137)
at org.openqa.selenium.remote.http.netty.NettyClient.openSocket(NettyClient.java:132)
at org.openqa.selenium.devtools.Connection.<init>(Connection.java:77)
at org.openqa.selenium.chromium.ChromiumDriver.lambda2(ChromiumDriver.java:124)
at java.util.Optional.map(Optional.java:215)
at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:122)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:106)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:93)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:82)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.getChromeDriver(ChromeDriverDubboImpl.java:162)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.callChrome(ChromeDriverDubboImpl.java:126)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.lambda0(ChromeDriverDubboImpl.java:137)
at java.util.concurrent.ExecutorsWorker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
20220430 09:56:51.629 [pool-3-thread-1] [WARN ] [TID:N/A] org.openqa.selenium.remote.http.netty.NettyWebSocket - java.lang.IllegalArgumentException: No WebSocketUpgradeHandler but scheme is ws
java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: No WebSocketUpgradeHandler but scheme is ws
at org.asynchttpclient.ListenableFutureoriginal
original
accessor
auxiliary
create
new
null
RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutororiginal
create
new
null
RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutororiginal
original
accessor
auxiliary
create
new
null
RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutorCompletedFailure.<init>(ListenableFuture.java:86)
at org.asynchttpclient.DefaultAsyncHttpClient.executegPmIvOBp(DefaultAsyncHttpClient.java:262)
at org.asynchttpclient.DefaultAsyncHttpClient.executegPmIvOBp
P9Gq6idG(DefaultAsyncHttpClient.java)
at org.asynchttpclient.DefaultAsyncHttpClientV5w3vlRG.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInterWithOverrideArgs.intercept(InstMethodsInterWithOverrideArgs.java:85)
at org.asynchttpclient.DefaultAsyncHttpClient.execute(DefaultAsyncHttpClient.java)
at org.asynchttpclient.DefaultAsyncHttpClient.executeRequest(DefaultAsyncHttpClient.java:228)
at org.asynchttpclient.BoundRequestBuilder.execute(BoundRequestBuilder.java:35)
at org.openqa.selenium.remote.http.netty.NettyWebSocket.<init>(NettyWebSocket.java:66)
at org.openqa.selenium.remote.http.netty.NettyWebSocket.lambda3(NettyWebSocket.java:137)
at org.openqa.selenium.remote.http.netty.NettyClient.openSocket(NettyClient.java:132)
at org.openqa.selenium.devtools.Connection.<init>(Connection.java:77)
at org.openqa.selenium.chromium.ChromiumDriver.lambda2(ChromiumDriver.java:124)
at java.util.Optional.map(Optional.java:215)
at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:122)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:106)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:93)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:82)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.getChromeDriver(ChromeDriverDubboImpl.java:162)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.callChrome(ChromeDriverDubboImpl.java:126)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.lambda0(ChromeDriverDubboImpl.java:137)
at java.util.concurrent.ExecutorsWorker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: No WebSocketUpgradeHandler but scheme is ws
at org.asynchttpclient.netty.request.NettyRequestSender.validateWebSocketRequest(NettyRequestSender.java:577)
at org.asynchttpclient.netty.request.NettyRequestSender.sendRequest(NettyRequestSender.java:95)
at org.asynchttpclient.DefaultAsyncHttpClient.executegPmIvOBp(DefaultAsyncHttpClient.java:259)
... 24 common frames omitted
20220430 09:56:51.837 [pool-3-thread-2] [ERROR] [TID:N/A] com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl - ChromeDriver启动失败,error msg:Unable to establish websocket connection to http://localhost:10870/devtools/browser/ad72bc97-293a-4821-b43a-acc2e8f7cfc4
Build info: version: '4.1.3', revision: '7b1ebf28ef'
System info: host: 'cloud-dfs-100-61', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-142-generic', java.version: '1.8.0_151'
Driver info: driver.version: ChromeDriver
org.openqa.selenium.remote.http.ConnectionFailedException: Unable to establish websocket connection to http://localhost:10870/devtools/browser/ad72bc97-293a-4821-b43a-acc2e8f7cfc4
Build info: version: '4.1.3', revision: '7b1ebf28ef'
System info: host: 'cloud-dfs-100-61', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-142-generic', java.version: '1.8.0_151'
Driver info: driver.version: ChromeDriver
at org.openqa.selenium.remote.http.netty.NettyWebSocket.<init>(NettyWebSocket.java:104)
at org.openqa.selenium.remote.http.netty.NettyWebSocket.lambda3(NettyWebSocket.java:137)
at org.openqa.selenium.remote.http.netty.NettyClient.openSocket(NettyClient.java:132)
at org.openqa.selenium.devtools.Connection.<init>(Connection.java:77)
at org.openqa.selenium.chromium.ChromiumDriver.lambda2(ChromiumDriver.java:124)
at java.util.Optional.map(Optional.java:215)
at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:122)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:106)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:93)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:82)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.getChromeDriver(ChromeDriverDubboImpl.java:162)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.callChrome(ChromeDriverDubboImpl.java:126)
at com.deepwise.cloud.dfs.dubbo.ChromeDriverDubboImpl.lambda0(ChromeDriverDubboImpl.java:137)
at java.util.concurrent.ExecutorsWorker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
解决过程
看了下报错的对战信息,发现是因为skywalking字节码的增强造成的
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInterWithOverrideArgs.intercept(InstMethodsInterWithOverrideArgs.java:85)
在使用chromedriver的时候需要引入依赖包
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>4.1.3</version>
</dependency>
通过这个依赖包间接依赖了
<dependency>
<groupId>org.asynchttpclient</groupId>
<artifactId>async-http-client</artifactId>
<version>2.12.3</version>
</dependency>
而skywalking对aync-http-client的增强导致报错
NettyRequestSender的sendRequest在发送ws://localhost:26135/devtools/browser请求的时候,入参WebSocketUpgradeHandler被skywalking的增强转成了AsyncHandlerWrapper,导致如下校验发生报错 No WebSocketUpgradeHandler but scheme is ws
private void validateWebSocketRequest(Request request, AsyncHandler<?> asyncHandler) {
Uri uri = request.getUri();
boolean isWs = uri.isWebSocket();
if (asyncHandler instanceof WebSocketUpgradeHandler) {
if (!isWs) {
throw new IllegalArgumentException(
"WebSocketUpgradeHandler but scheme isn't ws or wss: " + uri.getScheme());
} else if (!request.getMethod().equals(GET) && !request.getMethod().equals(CONNECT)) {
throw new IllegalArgumentException(
"WebSocketUpgradeHandler but method isn't GET or CONNECT: " + request.getMethod());
}
} else if (isWs) {
throw new IllegalArgumentException("No WebSocketUpgradeHandler but scheme is " + uri.getScheme());
}
}
所以需要取消对aync-http-client的增强来防止报错,查看skywalking的插件apm-asynchttpclient-2.x-plugin-8.3.0.jar是用来对aync-http-client注入增强用的,删除这个插件后,恢复正常。
版本说明
Skywalking 8.3.0
selenium-chrome-driver 4.1.3
chromeDriver 80.0.3987.16