升级至Selenium 4.29.0后无法创建Chrome会话求助
Selenium 4.29.0升级后ChromeDriver启动报错:session not created: probably user data directory is already in use
近期将Selenium从4.27.0升级至4.29.0后,运行自动化测试时遇到SessionNotCreatedException,错误提示用户数据目录被占用,但代码中并未显式指定--user-data-dir参数,手动指定路径后问题依然存在,甚至移除所有启动参数也无法解决。
错误日志
org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: session not created: probably user data directory is already in use, please specify a unique value for --user-data-dir argument, or don't use --user-data-dir Host info: host: '<< SERVER NAME >>', ip: '<< SERVER IP >>' Build info: version: '4.29.0', revision: '5fc1ec94cb' System info: os.name: 'Linux', os.arch: 'amd64', os.version: '6.1.0-32-amd64', java.version: '17.0.14' Driver info: org.openqa.selenium.chrome.ChromeDriver Command: [null, newSession {capabilities=[Capabilities {browserName: chrome, goog:chromeOptions: {args: [--headless, --disable-dev-shm-usage], binary: /usr/bin/google-chrome, extensions: []}}]}] at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:114) at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:75) at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:61) at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:187) at org.openqa.selenium.remote.service.DriverCommandExecutor.invokeExecute(DriverCommandExecutor.java:216) at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:174) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:545) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:245) at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:174) at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:110) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:88) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:83) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:72)
ChromeDriver初始化代码
ChromeOptions options = new ChromeOptions(); HashMap<String, Object> chromePrefs = new HashMap<>(); chromePrefs.put("download.default_directory", downloadFolder.getAbsolutePath()); options.setExperimentalOption("prefs", chromePrefs); options.addArguments("--headless"); options.addArguments("--disable-dev-shm-usage"); WebDriver driver = new ChromeDriver(options);
解决思路
1. 清理残留的Chrome/ChromeDriver进程
Linux环境下测试结束后,可能存在未正常退出的Chrome或ChromeDriver进程占用用户数据目录,执行以下命令强制清理:
# 杀掉所有Chrome相关进程 pkill -9 chrome pkill -9 chromedriver
清理完成后重新运行测试,观察问题是否消失。
2. 显式指定唯一临时用户数据目录
Selenium 4.29.0的默认行为可能存在变更,自动复用了固定目录导致冲突。可以动态生成唯一临时目录规避:
ChromeOptions options = new ChromeOptions(); // 生成临时用户数据目录 File userDataDir = Files.createTempDirectory("chrome-user-data").toFile(); options.addArguments("--user-data-dir=" + userDataDir.getAbsolutePath()); HashMap<String, Object> chromePrefs = new HashMap<>(); chromePrefs.put("download.default_directory", downloadFolder.getAbsolutePath()); options.setExperimentalOption("prefs", chromePrefs); options.addArguments("--headless"); options.addArguments("--disable-dev-shm-usage"); WebDriver driver = new ChromeDriver(options); // 测试结束后自动删除临时目录(避免磁盘占用) Runtime.getRuntime().addShutdownHook(new Thread(() -> { deleteDirectory(userDataDir); }));
补充目录删除方法:
private static void deleteDirectory(File dir) { File[] files = dir.listFiles(); if (files != null) { for (File file : files) { deleteDirectory(file); } } dir.delete(); }
3. 检查Chrome与ChromeDriver版本兼容性
Selenium 4.29.0对ChromeDriver的版本要求可能有更新,必须保证Chrome浏览器和ChromeDriver版本完全匹配(如Chrome 124对应ChromeDriver 124.x)。通过以下命令查看当前版本:
# 查看Chrome版本 google-chrome --version # 查看ChromeDriver版本 chromedriver --version
若版本不匹配,下载对应版本的ChromeDriver替换。
4. 检查用户数据目录的文件权限
Linux环境下,测试运行用户可能没有默认用户数据目录的读写权限,或目录所属用户/组错误。可以手动创建一个目录并赋予读写权限,再指定为--user-data-dir路径。
5. 禁用Selenium Manager自动配置(可选)
Selenium 4.x自带的Selenium Manager自动管理ChromeDriver,升级后可能出现兼容性问题。可以显式指定ChromeDriver路径禁用自动管理:
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); ChromeOptions options = new ChromeOptions(); // 后续配置不变
内容的提问来源于stack exchange,提问作者threenplusone
相关产品推荐
相关产品推荐

