selenuim执行脚本完毕后未关闭chromedriver任务--解决方案

 使用idea写页面登陆脚本,发现debug之后进程无法结束。关闭idea时出现waiting for process detach。必须kill process才能再次启动debug。

 代码如下:

导入模块省略
browser=webdriver.Chrome()
browser.get("http://10.138.60.150:8002/")
#页面操作代码省略
#查看句柄,确认确实只有一个tab
"""handle=browser.current_window_handle
print(handle)
handles=browser.window_handles
print(handles)"""
#关闭浏览器
browser.close()

因为只有一个tab页,理论上browser.close()和browser.quit()效果应该是一致的。

官网上对两者的介绍如下:

1、close() :

      用于关闭当前窗口,当打开的窗口较多时,就可以用.close()关闭部分窗口。

2、quit():

      用于结束进程 ,关闭所有窗口,尝试完全关闭浏览器。.quit()可以回收C盘的临时文件。

上面代码如果#关闭浏览器 browser.close()换成#关闭浏览器 browser.quit(),则可以顺利结束进程。

执行脚本代码时涉及任务如下:

执行完close()方法后,发现chromedriver任务未关闭。

手动结束任务后,idea报进程结束。可再次调试。

 

 

原因分析:

频繁的启动关闭,chromdriver会增加一个比较明显的延时导致浏览器进程不被关闭的情况发生,因此.close()方法无法关闭进程,进程里残留chromedriver.exe任务,导致进程无法结束。

解决方案:

方案一、使用.quit()方法,回收C盘所有临时文件。但是要注意,.quit()方法尝试关闭所有的浏览器,多线程时要注意。

方案二、直接引用os模块,杀死进程。代码如下:

import os
#过程代码省略
#browser.quit()  #彻底关闭浏览器
os.system("taskkill /im chrome.exe /F")  #杀死chrome.exe进程
os.system("taskkill /im chromedriver.exe /F")  #杀死 chromedriver.exe进程

方案三:使用service库来实现控制chromedriver的开启和关闭。

from selenium.webdriver.chrome.service import Service

# 控制chromedriver服务
driver_service = Service("D:\Work\python\chromedriver.exe")
driver_service.command_line_args()
driver_service.start()#开启一个chromedriver.exe任务

#启动浏览器
browser = webdriver.Chrome()#这里又开启一个chromedriver.exe任务
browser.get("http://10.138.60.150:8002/")

#过程代码省略
browser.close()
driver_service.stop() 

注意:#因为.close()方法没有关闭chromedriver.exe,这里driver_service.stop()实际上是终止了2个chromedriver.exe。

 

posted @ 2021-07-13 17:55  CQUqinghua  阅读(2425)  评论(0编辑  收藏  举报