Selenium UnreachableBrowserException异常处理方案
Selenium版本4.0.0-alpha-6
客户端代码以Java为例
异常信息
org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died.
…
导致此异常的原因有很多,比如
网页长时间未响应
、
网页奔溃
、
错误的代理设置
等等都有可能导致driver与浏览器的链接建立失败,而且出现此异常后无法在对driver进行操作了,包括close、quit等方法都会继续抛出
UnreachableBrowserException
异常,继而连浏览器都无法用代码来关闭(当然通过直接kill相关进程也是能够关闭浏览器的),似乎这个异常一旦出现,一切就变得无能为力。
解决方法
这个异常当然是无法从根源上解决的,但是也有曲线救国的方法(
替身术
)。
原理
这个方案的核心思想就是在出现
UnreachableBrowserException
异常之前,找个背锅侠来转移这个异常,这里的背锅侠就是
TimeoutException
,**
UnreachableBrowserException
我们无法处理(driver会变得不可用),但是
TimeoutException
我们是有能力处理的(出现
TimeoutException
时,driver仍然是可用的)**,即我们要做的就是,在出现
UnreachableBrowserException
异常之前让selenium给我们抛出
TimeoutException
,再catch
TimeoutException
做处理,这样就可用达到灾难始终慢我一步😎的效果了。
代码
核心代码:
try{WebDriver.Timeouts timeouts = driver.manage().timeouts();// 核心设置,这里的超时时间必须要小于60,建议设置到55左右
timeouts.pageLoadTimeout(3,TimeUnit.SECONDS);}catch(TimeoutException e){// 此时的driver是可用的}
完整代码:
除核心代码外,其它的代码只是为了模拟出
UnreachableBrowserException
异常而已
publicclassTest{publicstaticvoidmain(String[] args){System.setProperty("webdriver.chrome.driver","resources/windows/92/chromedriver.exe");ChromeOptions chromeOptions =newChromeOptions();// 打开开发者工具,让debugger生效
chromeOptions.addArguments("--auto-open-devtools-for-tabs");WebDriver driver =newChromeDriver(chromeOptions);Map<String,Object> command =newHashMap<>();// 通过注入无限debugger 模拟出UnreachableBrowserException异常,这行js只在baidu的站点中生效
command.put("source","if(window.location.href.indexOf('baidu')!=-1){setInterval(()=>{debugger},50)}");((ChromeDriver) driver).executeCdpCommand("Page.addScriptToEvaluateOnNewDocument", command);/**
* 显示设置页面加载的超时时间,经测试,触发UnreachableBrowserException异常的连接超时时间是60秒,
* 并且从driver提供的API中暂时没有找到这个超时的设置点,所以页面加载的超时时间必须要小于60秒,这样就
* 可以在触发UnreachableBrowserException异常前触发TimeoutException,而TimeoutException被
* catch后driver是可以继续操作的
*/WebDriver.Timeouts timeouts = driver.manage().timeouts();// 核心设置,这里的超时时间必须要小于60,建议设置到55左右
timeouts.pageLoadTimeout(3,TimeUnit.SECONDS);long begin =System.currentTimeMillis();try{// 访问百度的站点,注入的debugger代码会生效,让网页一直阻塞住不能与driver建立起有效连接,从而抛出UnreachableBrowserException异常
driver.get("http://www.baidu.com");}catch(TimeoutException e){// 超时后访问腾讯的站点,driver仍然可用
e.printStackTrace();
driver.get("http://www.qq.com");System.out.println(driver.getTitle());}catch(UnreachableBrowserException e){System.out.println(System.currentTimeMillis()- begin);
e.printStackTrace();// 此时driver已经不可用,调用close,quit等操作都会继续抛出UnreachableBrowserException异常,从代码层面已经无法关闭浏览器}System.out.println("按任意键退出......");newScanner(System.in).next();
driver.quit();System.exit(0);}}
版权归原作者 有三i 所有, 如有侵权,请联系我们删除。