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。