0


Selenium UnreachableBrowserException异常处理方案

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);}}

本文转载自: https://blog.csdn.net/qq_56075795/article/details/127885855
版权归原作者 有三i 所有, 如有侵权,请联系我们删除。

“Selenium UnreachableBrowserException异常处理方案”的评论:

还没有评论