使用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。