Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)


Posted in Python onDecember 07, 2020

selenium操作chrome浏览器需要有ChromeDriver驱动来协助。webdriver中关浏览器关闭有两个方法,一个叫quit,一个叫close。

/**
  * Close the current window, quitting the browser if it's the last window currently open.
  */
 void close();

 /**
  * Quits this driver, closing every associated window.
  */
 void quit();

通过查看以上官方声明文档,可以看出close方法是关闭当前窗口,这个当前如何理解?就是driver实例操作的页面,叫当前。如果当前窗口只有一个tab,那么这个close方法就相当于关闭了浏览器。quit方法就是直接退出并关闭所有关联的tab窗口。所以,close方法一般关闭一个tab,quit方法才是我们认为的完全关闭浏览器方法。为了证明这个,我们用一个例子去演示:

package lessons;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class FindElement_LinkText {

  public static void main(String[] args) throws Exception {

    System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");

    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize();

    driver.get("https://www.baidu.com");

    driver.close();
    //driver.quit();
  }

}

通过切换注销最后两行代码,分别运行,观察这两种方法的实际效果。当使用close方法的时候,因为只有百度首页这个tab,所以会关闭浏览器,但是通过查看任务管理器发现,ChromeDriver进程仍存在内存中。如果使用quit方法,整个浏览器都直接关闭,ChromeDriver进程也会被结束。

ChromeDriver是轻量级的服务,在单任务或不需要频繁启动浏览器的情况下,使用driver.quit()关闭浏览器,可以正常结束ChromeDriver进程。若在一个比较大的 测试套件中频繁的启动关闭,会增加一个比较明显的延时导致浏览器进程不被关闭的情况发生,为了避免这一状况我们可以通过ChromeDriverService来控制ChromeDriver进程的生死,达到用完就关闭的效果避免进程占用情况出现(Running the  server in a child process)。具体实现如下:

ChromeDriverService service = new ChromeDriverService.Builder() .usingChromeDriverExecutable(new File("E:\\Selenium WebDriver\\chromedriver_win_23.0.1240.0\\chromedriver.exe")).usingAnyFreePort().build();
service.start();
driver = new ChromeDriver();
driver.get("http://www.baidu.com");
driver.quit();
// 关闭 ChromeDriver 接口
service.stop();

以上讨论的均是java版的实现,对于python来说是使用service库来实现控制chromedriver的开启和关闭。

from selenium.webdriver.chrome.service import Service

创建的时候需要把chromedriver.exe的位置写在Service的XXX部分,需要调用他的命令行方法,不然报错,然后启动就可以了。

c_service = Service('xxx')
c_service.command_line_args()
c_service.start()
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

关闭的时候用quit而不是采用close,close只会关闭当前页面,quit会退出驱动并且关闭所关联的所有窗口,最后执行完以后就关闭。

driver.quit()
c_service.stop()

嫌麻烦也可以直接使用python的os模块执行下面两句话结束进程

os.system('taskkill /im chromedriver.exe /F')
os.system('taskkill /im chrome.exe /F')

到此这篇关于Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)的文章就介绍到这了,更多相关Selenium关闭chromedriver/geckodriver进程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
深入理解python多进程编程
Jun 12 Python
Python科学画图代码分享
Nov 29 Python
python处理“
Jun 10 Python
Django的models模型的具体使用
Jul 15 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
python线程join方法原理解析
Feb 11 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
浅谈Python中的异常和JSON读写数据的实现
Feb 27 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
python线程优先级队列知识点总结
Feb 28 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
python 学习GCN图卷积神经网络
May 11 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 #Python
python 爬取小说并下载的示例
Dec 07 #Python
Python常用GUI框架原理解析汇总
Dec 07 #Python
pycharm中leetcode插件使用图文详解
Dec 07 #Python
使用Python爬取Json数据的示例代码
Dec 07 #Python
如何利用python生成MD5并去重
Dec 07 #Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 07 #Python
You might like
PHP中读写文件实现代码
2011/10/20 PHP
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
php实现购物车功能(上)
2020/07/23 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
为原生js Array增加each方法
2012/04/07 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
python绘制直线的方法
2018/06/30 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
python 装饰器的使用示例
2020/10/10 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
2015年工商局个人工作总结
2015/07/23 职场文书
高质量“欢迎词”
2019/04/03 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
php去除deprecated的实例方法
2021/11/17 PHP
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
Python如何用re模块实现简易tokenizer
2022/05/02 Python