打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
selenium webdriver 你所不知道的quit 和close
    我用selenium webdriver(以后简称SW)驱动谷歌浏览器进行网页数据的获取。之所以用谷歌,主要是由于它是轻量级的,速度快。
做数据获取,SW是不错的选择。有人总是说,SW速度慢,比不上httpclient或者HtmlUnit,它们直接操作底层数据来的更加痛快。可是,不得不考虑的是,网络数据获取是“你情我愿”的事情。你本地的程序运行再快,服务器那边给你CUT!你照样玩不转。所以,只要计算机能力足够强大,SW配合多线程,足以。

最近遇到一个恼火的问题,就是quit 和close,二者都是关闭浏览器。 
ChromeDriver chrome = new ChromeDriver();
chrome.close();
chrome.quit();

二者与什么区别吗?网上评论说,最好用quit而不用close. 因为quit关闭的更加彻底。可是从各个方面的测看,我都看不出二者的区别。后来在线程池使用中,发现了quit的一个致命问题。
由于我是要获取超大量的数据,所以,需要访问海量网址。我计划的是完成一个任务(用一个线程搞定),关闭浏览器,然后开辟另一个线程完成下一个任务。

结果出现了问题:
org.openqa.selenium.os.UnixProcess$SeleniumWatchDog destroyHarderINFO: Command failed to close cleanly. Destroying forcefully (v2)

后来一个高手(估计是维护者)如是说:
that's an INFO logging line, not a warning. It's just saying that the process took too long to finish naturally and so is now being killed with the equivalent of "kill -9"。
这是啥意思?经过我仔细审核自己的代码,我发现,问题处在了QUIT这个方法上。可是,当我对单独测试的时候,结果这个问题又不见了。

因此,可以肯定。chrome.quit();实际上去试图关闭所有的windows,虽然我只用了一个window,但是我之前访问了太多的网页,而没有进行quit和重启我的chrome.这让我的chrome中残留了太多的东西需要clean and close. 在最大允许的时间范围内,quit无法结束chrome,所以只能kill. 
出现这个提示后,程序卡住了,不再继续执行。

我不得不说,这是因为SW还不完善。但是,就目前看,多线程调用SW中关闭浏览器的最佳方式是使用close,这样就不会出现上述问题。

我还发现,chrome的方法中没有返回值为boolean的方法(除了equals之外),这一点很不利,因为我需要对chrome进行关闭,开启,切换等。如果不能准别把握chrome的状态,就可能出现很多异常陷阱。比如我想关闭,但是,如果这个chrome根本没开着,就会出现异常。所以,如果能增加一个chrome.isOpen方法,或者chrome.getState方法,就很好了。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Selenium2+python自动化5
selenium+python自动化92-Python is likely shutting down
selenium获取元素信息常用方法_selenium获取元素文本
在Python Selenium中为Chrome和Firefox浏览器开启headless模式 | 李辉的个人网站
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH
selenium+python显式等待和隐式等待
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服