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 destroyHarder
INFO: 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方法,就很好了。

                
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值