已有Chrome窗口运行时Selenium启动崩溃的解决求助
问题分析与解决方法
问题根源
Chrome的用户配置目录(User Data)同一时间只能被一个Chrome进程独占锁定。当你手动打开的Chrome已经在使用指定的配置文件时,Selenium启动的新Chrome实例无法获取该目录的访问权限,进而触发DevToolsActivePort file doesn't exist错误。无头模式下Chrome默认使用临时配置目录,因此不会出现冲突。
解决方法
方法一:使用独立的Selenium专用配置目录(推荐)
复制现有Chrome配置文件夹,让Selenium使用独立副本,彻底避免冲突:
- 找到你的Chrome用户数据目录(通常是
C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data) - 复制整个
User Data文件夹到新路径,比如C:\Users\Guy\ChromeSeleniumData - 修改代码中的
user_data_dir参数为这个新路径,profile_name保持不变:
bot = Bot(driverpath=PATH.EXEFile_chromedriver_v111, datadir=PATH.DIR_data, user_agent=SETUPCONFIG.constant.chrome_user_agent, user_data_dir=r"C:\Users\Guy\ChromeSeleniumData", # 替换为复制后的新路径 profile_name=SETUPCONFIG.constant.chrome_profile_name, headless=False)
方法二:指定远程调试端口强制隔离实例
如果不想复制配置,可以通过指定独立调试端口来避免端口冲突(但仍需确保配置目录未被手动Chrome占用,或仅在必要时使用):
在create_options方法中添加以下参数:
@staticmethod def create_options(**kwargs) -> Options: options = Options() options.headless = kwargs.get('headless', False) if not (user_data_dir := kwargs.get("user_data_dir")) is None and os.path.isdir(user_data_dir): if not (profile := kwargs.get('profile_name')) is None and os.path.isdir(f'{user_data_dir}\\{profile}'): options.add_argument(f"--user-data-dir={user_data_dir}") options.add_argument(f'--profile-directory={profile}') # 添加这两行参数 options.add_argument('--remote-debugging-port=9222') # 指定任意未被占用的端口 options.add_argument('--no-first-run') # 跳过首次运行初始化 # 其余原有参数保持不变 if not (user_agent := kwargs.get("user_agent")) is None: options.add_argument(f'--user-agent={user_agent}') options.add_argument('start-maximized') options.add_argument('--ignore-certificate-errors') # ... 省略其他原有参数 return options
方法三:连接到已运行的Chrome实例
如果希望Selenium直接控制你手动打开的Chrome窗口,可通过远程调试实现:
- 关闭所有Chrome窗口
- 右键Chrome快捷方式,在「目标」栏末尾添加
--remote-debugging-port=9222,示例:"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 - 启动Chrome,此时它会监听9222端口
- 修改Selenium代码,连接到该实例(无需指定
user_data_dir和profile_name):
def test(): os.system('cls') options = Options() options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") bot = webdriver.Chrome(service=Service(PATH.EXEFile_chromedriver_v111), options=options) input('press any key to continue...')
内容的提问来源于stack exchange,提问作者Michael Archman
相关产品推荐
相关产品推荐

