Selenium偶发删除Chrome配置文件问题咨询(约30次出现1次)
我遇到了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
问题原因分析
强制杀进程破坏配置索引
代码中用psutil暴力杀死所有含chrome的进程,会导致Chrome来不及正确写入User Data目录下的Preferences文件——这个文件是Chrome用来维护配置文件列表的核心索引。强制终止会让索引中的Profile 9条目被意外移除,但物理文件本身并未被删除,所以浏览器里看不到配置,但文件还在。固定调试端口引发冲突
你指定了固定的remote-debugging-port=9222,如果前一次执行的Chrome进程没有完全退出,新实例启动时会触发端口冲突,可能导致配置加载异常,进而让Chrome触发配置索引重置逻辑。文件锁未释放导致损坏判定
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

