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
,再catchTimeoutException
做处理,这样就可用达到灾难始终慢我一步😎的效果了。
代码
核心代码:
try{
WebDriver.Timeouts timeouts = driver.manage().timeouts();
// 核心设置,这里的超时时间必须要小于60,建议设置到55左右
timeouts.pageLoadTimeout(3, TimeUnit.SECONDS);
}catch(TimeoutException e){
// 此时的driver是可用的
}
完整代码:
除核心代码外,其它的代码只是为了模拟出UnreachableBrowserException
异常而已
public class Test {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "resources/windows/92/chromedriver.exe");
ChromeOptions chromeOptions = new ChromeOptions();
// 打开开发者工具,让debugger生效
chromeOptions.addArguments("--auto-open-devtools-for-tabs");
WebDriver driver = new ChromeDriver(chromeOptions);
Map<String, Object> command = new HashMap<>();
// 通过注入无限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("按任意键退出......");
new Scanner(System.in).next();
driver.quit();
System.exit(0);
}
}