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

Selenium偶发删除Chrome配置文件问题咨询(约30次出现1次)

Selenium偶发导致Chrome配置文件在浏览器中消失(物理文件仍存在)

我遇到了Selenium偶发导致Chrome配置文件在浏览器中消失的问题,该问题大约每30次执行会出现1次。执行后浏览器显示配置为空,但配置文件仍存在于C:\Users\Danzel\AppData\Local\Google\Chrome\User Data文件夹中,请问为何配置文件会从浏览器中消失?

我的代码

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import os, sys, time, json, glob
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import shutil,requests 
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument(r'user-data-dir=C:\Users\Danzel\AppData\Local\Google\Chrome\User Data')
chrome_options.add_argument(r'profile-directory=Profile 9')
chrome_options.add_argument("--remote-debugging-port=9222")  # this
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_argument('--disable-web-security')
chrome_options.add_argument('--disable-setuid-sandbox')
chrome_options.add_argument('--allow-running-insecure-content')
try:
    driver = webdriver.Chrome(ChromeDriverManager().install(),chrome_options=chrome_options)
except ValueError:
    driver = webdriver.Chrome(ChromeDriverManager(version="116.0.5845.96").install(),chrome_options=chrome_options)
#driver = webdriver.Chrome(chromedriver_autoinstaller.install(), options=chrome_options)
driver.implicitly_wait(1)

driver.get("https://www.google.com/")

#some code

driver.close()
try:
    [x.kill() for x in psutil.process_iter() if 'chrome' in x.name().lower()]
except psutil.NoSuchProcess:
    pass

问题原因分析

  1. 强制杀进程破坏配置索引
    代码中用psutil暴力杀死所有含chrome的进程,会导致Chrome来不及正确写入User Data目录下的Preferences文件——这个文件是Chrome用来维护配置文件列表的核心索引。强制终止会让索引中的Profile 9条目被意外移除,但物理文件本身并未被删除,所以浏览器里看不到配置,但文件还在。

  2. 固定调试端口引发冲突
    你指定了固定的remote-debugging-port=9222,如果前一次执行的Chrome进程没有完全退出,新实例启动时会触发端口冲突,可能导致配置加载异常,进而让Chrome触发配置索引重置逻辑。

  3. 文件锁未释放导致损坏判定
    Selenium启动Chrome时会对Profile 9目录下的文件加锁,如果driver.close()执行后锁还没释放就强制杀进程,Chrome下次启动会判定该配置文件损坏,从而在配置列表中隐藏它。

解决方案

  • 替换暴力杀进程逻辑
    优先用driver.quit()正常关闭驱动,仅在必要时精准清理当前实例的关联进程,不要通杀所有Chrome进程:

    # 优先正常关闭驱动
    try:
        driver.quit()  # quit()会彻底关闭驱动及所有关联进程,比close()更彻底
    except Exception:
        pass
    
    # 仅清理当前驱动的残留进程
    import psutil
    try:
        current_pid = driver.service.process.pid
        parent_process = psutil.Process(current_pid)
        # 递归获取所有子进程(Chrome相关进程)
        for child in parent_process.children(recursive=True):
            if 'chrome' in child.name().lower():
                child.terminate()
        parent_process.terminate()
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        pass
    
  • 使用动态调试端口
    移除固定端口参数,或改用随机端口避免冲突:

    import random
    chrome_options.add_argument(f"--remote-debugging-port={random.randint(9000, 9999)}")
    
  • 使用配置文件副本
    每次运行前复制原配置到临时目录,避免原配置被意外破坏:

    import tempfile
    import shutil
    
    # 创建临时目录
    temp_user_data = tempfile.mkdtemp()
    # 复制原Profile 9到临时目录
    source_profile = r"C:\Users\Danzel\AppData\Local\Google\Chrome\User Data\Profile 9"
    target_profile = os.path.join(temp_user_data, "Profile 9")
    shutil.copytree(source_profile, target_profile)
    # 配置Chrome使用临时目录
    chrome_options.add_argument(f'user-data-dir={temp_user_data}')
    chrome_options.add_argument(r'profile-directory=Profile 9')
    
  • 校验并修复Preferences文件
    问题出现时,打开User Data目录下的Preferences文件,搜索Profile 9相关条目。如果条目丢失,可手动添加或在代码中添加索引校验逻辑,避免索引被破坏后无法恢复。

内容的提问来源于stack exchange,提问作者Denzel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:57:38