You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在外部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:43:34