Selenium启动Chrome WebDriver时遭遇SessionNotCreatedException:用户数据目录已被占用
Selenium启动Chrome WebDriver时遭遇SessionNotCreatedException:用户数据目录已被占用
看起来你遇到的这个问题确实挺闹心的,我之前在Ubuntu环境下也碰到过类似的资源锁死情况,给你几个额外的排查和解决思路试试:
1. 清理残留的Chromedriver进程
你已经尝试杀死Chrome主进程,但可能漏掉了chromedriver的残留进程——这些后台进程往往会偷偷占用用户数据目录的锁文件。试试执行这条命令:
pkill -9 chromedriver
之后再重新运行你的脚本,看看是否还会报错。
2. 给Chrome添加更多隔离参数
有时候浏览器的扩展、缓存或者GPU渲染模块也会导致目录占用,试试在ChromeOptions里补充这些参数:
options.add_argument("--disable-extensions") options.add_argument("--disable-cache") options.add_argument("--disable-application-cache") options.add_argument("--disable-gpu") # 无头模式下推荐添加,避免渲染层的资源冲突 options.add_argument("--no-sandbox") # Ubuntu环境下偶尔需要,绕过沙箱限制
3. 给临时目录搭配独立的Profile子目录
你已经用了临时目录,但可以再指定一个唯一的Profile子目录,进一步隔离每个WebDriver实例的环境:
import tempfile import uuid # 生成唯一的用户数据目录和Profile名 user_data_dir = tempfile.mkdtemp() profile_name = f"Profile_{str(uuid.uuid4())[:8]}" options.add_argument(f"--user-data-dir={user_data_dir}") options.add_argument(f"--profile-directory={profile_name}")
这样每个启动的实例都会拥有完全独立的配置空间,几乎不会出现冲突。
4. 确保driver.quit()被100%执行
如果脚本中途意外崩溃,driver.quit()没来得及执行,就会留下僵尸进程占用资源。用try...finally包裹逻辑,保证退出动作必执行:
driver = None try: driver = createModel() driver.get("https://www.google.com") print(driver.title) finally: if driver is not None: driver.quit()
5. 检查临时目录的权限
虽然/tmp目录默认是开放权限,但如果之前手动创建过固定路径的用户目录,可能出现权限问题。可以用这条命令查看目录权限:
ls -ld /tmp/selenium-user-data
如果权限不对,执行:
chmod -R 777 /tmp/selenium-user-data
(用临时目录的话这个问题概率很低,但还是可以排查下)
6. 尝试降级Chrome/Chromedriver版本
有时候最新版的Chrome和Chromedriver会存在兼容性小bug,导致这类奇怪的锁死问题。可以指定一个稳定的旧版本试试,比如:
service = Service(ChromeDriverManager(version="118.0.5993.70").install())
记得Chrome浏览器版本也要对应降级,避免版本不匹配。
另外,如果你想用固定路径的用户目录,可以在启动前手动清空旧目录,避免残留的锁文件:
import shutil import os user_data_dir = "/tmp/selenium-user-data" if os.path.exists(user_data_dir): shutil.rmtree(user_data_dir) options.add_argument(f"--user-data-dir={user_data_dir}")
试试上面这些方法,应该能解决你的问题!
备注:内容来源于stack exchange,提问作者Ammar Ahmed




