如何在外部Python脚本中执行Selenium的driver.quit()方法
从外部脚本关闭Selenium会话的解决方案
一、直接导入运行中的webdriver会话不可行
直接在close_Selenium.py里导入test.py的driver对象完全行不通——两个脚本是独立的进程,内存空间相互隔离,导入后拿到的是新创建的对象,根本不是正在运行的那个会话实例。
二、方案1:启动时保存PID,通过PID关闭进程
修改原test.py,启动Chrome后把相关进程的PID写入文件,再让close_Selenium.py读取文件里的PID并终止进程,这是精准关闭的可靠方式。
修改后的test.py
from selenium import webdriver from selenium.webdriver.chrome.options import Options import os import psutil options = Options() options.add_argument("-headless=new") driver = webdriver.Chrome(options=options) driver.get('https://www.google.com') # 保存Chrome驱动和浏览器进程的PID到文件 with open('selenium_pids.txt', 'w') as f: # 写入ChromeDriver的PID f.write(f"{driver.service.process.pid}\n") # 写入所有关联的Chrome浏览器子进程PID chrome_driver_proc = psutil.Process(driver.service.process.pid) for child_proc in chrome_driver_proc.children(recursive=True): f.write(f"{child_proc.pid}\n") # 模拟会话持续运行(可替换为实际业务逻辑) input("按回车键结束会话...") driver.quit()
close_Selenium.py代码
import os import signal try: # 读取PID文件 with open('selenium_pids.txt', 'r') as f: pids = [int(line.strip()) for line in f if line.strip().isdigit()] # 逐个终止进程 for pid in pids: try: if os.name == 'nt': os.kill(pid, signal.CTRL_C_EVENT) # Windows系统终止逻辑 else: os.kill(pid, signal.SIGTERM) # Linux/macOS优雅终止 print(f"已终止PID为{pid}的进程") except OSError as e: print(f"终止PID {pid}失败: {e}") # 清理PID文件 os.remove('selenium_pids.txt') except FileNotFoundError: print("未找到selenium_pids.txt,当前无运行中的Selenium会话")
注意:需要提前安装
psutil库,执行pip install psutil即可。
三、方案2:直接查找并关闭关联Chrome进程
如果不想修改原test.py,可以直接扫描系统进程,匹配Selenium相关的Chrome进程并关闭。
close_Selenium.py代码(直接查找进程)
import psutil def kill_selenium_chrome(): for proc in psutil.process_iter(['name', 'cmdline']): try: # 匹配ChromeDriver和无头Chrome进程 proc_name = proc.name() if proc_name in ['chromedriver.exe', 'chromedriver', 'chrome.exe', 'Google Chrome']: cmdline = ' '.join(proc.cmdline()) # 精准匹配无头模式或ChromeDriver特征 if '--headless=new' in cmdline or 'chromedriver' in cmdline: proc.terminate() proc.wait() # 等待进程完全终止 print(f"已终止进程: {proc_name} (PID: {proc.pid})") except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): continue kill_selenium_chrome()
注意:这个方案可能误杀其他Chrome进程,建议在测试环境使用,或者添加更独特的启动参数来精准匹配。
四、关键说明
driver.quit()是最干净的关闭方式,会同时关闭浏览器和驱动进程,但只能在启动会话的脚本中调用。- 外部脚本无法直接调用已运行会话的
quit()方法,因为进程间内存完全隔离,只能通过进程管理的方式终止会话。
内容的提问来源于stack exchange,提问作者Claytor
相关产品推荐
相关产品推荐

