ChromeDriver 与 Chrome 浏览器版本必须严格匹配,否则抛出 SessionNotCreatedException;应通过官方发布页按 chrome --version 精确查找对应小版本驱动,推荐使用 WebDriverManager 自动管理,并注意架构兼容性、ChromeOptions 正确传入、依赖去重、quit() 必须放在 finally 或 @AfterEach 中。

ChromeDriver 版本和 Chrome 浏览器不匹配导致 SessionNotCreatedException
这是最常卡住人的第一步:明明写了 WebDriver driver = new ChromeDriver();,却抛出 SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version XX。根本原因不是“没配驱动”,而是版本对不上。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 别用第三方下载站的“最新版”
chromedriver.exe—— 它往往滞后或超前;直接去 官方发布页,按你本地chrome --version输出的精确小版本号找对应驱动(比如 Chrome 124.0.6367.78 → 找 124.0.6367.78 这一栏) - Java 项目里别手动把
chromedriver.exe放进src/main/resources然后硬编码路径;改用System.setProperty("webdriver.chrome.driver", "绝对路径")容易漏掉权限或路径空格问题;推荐用WebDriverManager自动管理:WebDriverManager.chromedriver().setup();<br>WebDriver driver = new ChromeDriver();
- Mac M1/M2 用户注意:Chrome 浏览器必须是 ARM64 架构(从官网下载),否则即使驱动版本对得上,也会因架构不兼容静默失败
Java 项目里 ChromeOptions 配置不起作用
写了一堆 options.addArguments("--headless", "--no-sandbox"),但浏览器还是弹窗、还是报 DevToolsActivePort file doesn't exist,说明参数没生效或顺序错了。
实操建议:
立即学习“Java免费学习笔记(深入)”;
-
ChromeOptions必须在new ChromeDriver(options)时传入,不能先new ChromeDriver()再去 set;更不能只声明 options 却没用上 -
--headless=new是 Chrome 109+ 的新写法,旧写法--headless在新版里会退化为“无界面但仍有 GUI 依赖”,导致 CI 环境失败;CI 服务器(如 GitHub Actions)务必用--headless=new - Linux 服务器缺字体、缺共享库时,光加
--no-sandbox不够,还得补:--disable-dev-shm-usage、--font-render-hinting=none;否则页面渲染空白或元素定位失败
Maven 依赖冲突让 org.openqa.selenium.WebDriver 找不到
明明写了 import org.openqa.selenium.WebDriver;,IDE 不报错,但运行时报 NoClassDefFoundError: org/openqa/selenium/WebDriver,十有八九是依赖拉了多个 Selenium 版本,或者混进了旧版 selenium-java 和单独的 selenium-api。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 检查
pom.xml里是否同时存在:selenium-java、selenium-api、selenium-chrome-driver等多个模块——只要留selenium-java一个就够了,它已包含全部子模块 - 用
mvn dependency:tree | grep selenium查有没有传递依赖引入了老版本(比如 3.x);若有,用<exclusions>干掉冲突项 - Gradle 用户注意:
testImplementation 'org.seleniumhq.selenium:selenium-java:4.18.1'必须显式指定完整版本号;别用+或latest.release,Selenium 4.x 和 3.x 的 API 兼容性断裂明显
测试用例跑完不退出浏览器,Jenkins 构建卡死
本地跑一次 driver.quit() 没问题,但 Jenkins 上跑完进程还在,后续任务被占满资源,日志里反复出现 Unable to kill process with PID。
实操建议:
立即学习“Java免费学习笔记(深入)”;
-
driver.quit()必须放在finally块里,或用 JUnit5 的@AfterEach;别信“测试方法结束自动释放”,Java 不会自动回收 native 进程 - Linux 服务器上,Chrome 进程可能残留僵尸子进程(如 GPU 进程、Renderer);加一句
Runtime.getRuntime().exec("pkill -f chrome");太粗暴,容易误杀;稳妥做法是在ChromeOptions中加--disable-gpu --disable-extensions --disable-plugins减少子进程数量 - Jenkins 节点用 Docker 启动时,容器默认 PID namespace 隔离不彻底;要在
docker run加--pid=host,否则quit()发的 SIGTERM 可能收不到
真正的麻烦往往藏在 Chrome 启动参数和容器环境的组合细节里,而不是“装没装驱动”这种表面问题。











