Selenium webdriver 硒脚本抛出间歇性';无法访问的浏览器异常';(硒:3.12.0,3.13.0)

Selenium webdriver 硒脚本抛出间歇性';无法访问的浏览器异常';(硒:3.12.0,3.13.0),selenium-webdriver,selenium-chromedriver,Selenium Webdriver,Selenium Chromedriver,调试我的一个selenium脚本时,我得到了间歇性的org.openqa.selenium.remote.UnreachableBrowserException。为了进一步调试它,我编写了一个代码来捕获WebDriverException(try/catch)&每当脚本遇到WebDriverException时就截图 在这里,我很惊讶地看到,即使在获得无法访问的浏览器异常 不UnreachableBrowserException表示会话不可访问,因此它应该无效。因此,对无效会话的webdrive

调试我的一个selenium脚本时,我得到了间歇性的
org.openqa.selenium.remote.UnreachableBrowserException
。为了进一步调试它,我编写了一个代码来捕获
WebDriverException
(try/catch)&每当脚本遇到
WebDriverException
时就截图

在这里,我很惊讶地看到,即使在获得
无法访问的浏览器异常

UnreachableBrowserException
表示会话不可访问,因此它应该无效。因此,对无效会话的webdriver对象执行的任何操作都应该抛出
WebDriverException

如果我错了,请纠正我&请解释上述奇迹(即使在获得
无法访问的浏览器异常后,截图仍然有效)

为了便于分析,我在此附上stacktrace

请看这里,当尝试获取浏览器的当前url时,我得到了
无法访问的浏览器异常
,但是截图捕获工作正常,我可以看到截图保存在该位置

    org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died.
Build info: version: '3.12.0', revision: '7c6e0b3', time: '2018-05-08T14:04:26.12Z'
System info: host: 'mymachine', ip: 'fe80:0:0:0:1c57:d76e:b55f:37ce%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.6', java.version: '1.8.0_121'
Driver info: driver.version: RemoteWebDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.36.540469 (1881fd7f864150..., userDataDir: /var/folders/ym/dtyc5vz9785...}, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: MAC, platformName: MAC, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 67.0.3396.99, webStorageEnabled: true, webdriver.remote.sessionid: f4748ff254f6fe0418a37e3ab40...}
Session ID: f4748ff254f6fe0418a37e3ab40c3604
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:564)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:600)
    at org.openqa.selenium.remote.RemoteWebDriver.getCurrentUrl(RemoteWebDriver.java:281)
    at getCurrentURL(MyDriverBot.java:1616)
    at Capture.main(Capture.java:31)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at okio.Okio$2.read(Okio.java:139)
    at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
    at okio.RealBufferedSource.indexOf(RealBufferedSource.java:345)
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:217)
    at okhttp3.internal.http1.Http1Codec.readHeaderLine(Http1Codec.java:212)
    at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189)
    at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
    at okhttp3.RealCall.execute(RealCall.java:77)
    at org.openqa.selenium.remote.internal.OkHttpClient.execute(OkHttpClient.java:105)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:155)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:543)
    ... 10 more
19:25:43.232 [Capture][captureScreenShotOnDashboardException] - Start Capturing screenshot (in case of exception is found
19:25:43.233 [Capture][takeDashboardScreenshot] - Screenshot will be kept at location : /Users/myuserName/result/myException.png
19:25:44.084 [Capture][captureScreenShotOnDashboardException] - End Capturing dashboard (in case of dashboard exception is found
更新 这确实是一个真正的问题,因此在selenium github上提交了一个问题

更新2
这在selenium-3.14版本中得到了修复。事实上,这是“OKHTTP”的一个问题,我尝试了以下两件事来证实这一点

1) 添加了
System.setProperty(“webdriver.http.factory”、“apache”)强制selenium在selenium v3.13中使用“apache”而不是“okhttp”。它起作用了,我没有超过random
UnreachableBrowserException
exception(测试了2/3次),但是执行(在识别元素方面)太慢了(我不知道为什么)

2) 我将selenium版本降级为使用3.8.1(从3.13)并重新启动了我的机器。再次构建我的gradle项目并执行代码2/3次。再一次,我没有超越
UnreachableBrowserException
exception


上述情况表明,“okhttp”似乎存在一些问题。到目前为止,我已经迁移到selenium 3.8.1&一切正常

我认为,如果页面超时出现问题,请尝试增加页面超时。这会有帮助的。我的页面已经被加载了,我已经用findElements获取了一些元素。我不知道为什么在尝试获取浏览器的当前URL时失败。我更新了selenium以使用最新的3.13版本和最新的chrome驱动程序,但是我仍然面临这个问题。请分享您的代码,这可能有助于更好地理解。感谢您对帮助我的朋友表现出兴趣。就代码而言,我必须编写一个新的代码,因为这个问题发生的代码在我的框架中有很多层。因此,我可能必须找到一种方法来生成干净的替代代码来显示这个问题。此外,正如我所说的问题是随机发生的,这可能使我的工作更难产生干净的可复制代码(不过我会尝试)还有一件事,因为我确信我的代码根本没有问题,所以我猜测“OKHTTP”(与3.9中的selenium集成的新http客户端)是罪魁祸首。通过这个链接(),我将尝试这里提到的另一种方法(强制webdriver使用apache而不是okhttp)。这似乎是有希望的