Selenium ChromeDriver启动报错:ClassNotFoundException: org.openqa.selenium.devtools.HasDevTools
问题描述
计划开发一款基于SpringBoot、带图形界面的应用,通过Selenium ChromeDriver抓取信息并存储。目前SpringBoot和图形界面运行正常,但创建ChromeDriver实例时抛出NoClassDefFoundError,找不到org.openqa.selenium.devtools.HasDevTools类。相关代码、pom配置及报错信息如下:
核心代码
package com.example.printondemandsellerview; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class AmazonMerchScraper { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); // Navigate to the login page driver.get("https://merch.amazon.com/"); // Find and click on the Sign In button WebElement signInButton = driver.findElement(By.id("merch-nav-sign-in")); signInButton.click(); // Close the browser driver.quit(); } }
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>PrintOnDemandSellerView</artifactId> <version>0.0.1-SNAPSHOT</version> <name>PrintOnDemandSellerView</name> <description>PrintOnDemandSellerView</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-api</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-support</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>com.gluonhq</groupId> <artifactId>ignite-spring</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>net.rgielen</groupId> <artifactId>javafx-weaver-core</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-graphics</artifactId> <version>17.0.6</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>19-ea+7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>11</source> <target>11</target> </configuration> </plugin> </plugins> </build> </project>
报错信息
Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/devtools/HasDevTools at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) at com.example.printondemandsellerview.AmazonMerchScraper.main(AmazonMerchScraper.java:12) Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.devtools.HasDevTools at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 19 more
已尝试在新项目中单独创建该类、调整pom依赖,但均未解决问题。
解决建议
1. 清理重复的Selenium依赖
你的pom.xml中同时引入了selenium-api、selenium-chrome-driver、selenium-support和selenium-java,这会导致依赖冲突。selenium-java已经包含了其他三个依赖,只需保留selenium-java即可,删除其他三个Selenium相关依赖。修改后的依赖片段:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.5.3</version> </dependency>
2. 匹配ChromeDriver与Chrome浏览器版本
Selenium 4.5.3对应的ChromeDriver版本必须和本地安装的Chrome浏览器大版本一致(比如Chrome 106对应ChromeDriver 106.x):
- 查看Chrome版本:打开Chrome → 右上角三个点 → 帮助 → 关于Google Chrome
- 下载对应版本的ChromeDriver,替换当前使用的
C:\\Program Files (x86)\\chromedriver.exe
3. 改用Selenium内置驱动管理(推荐)
从Selenium 4开始,官方提供了自动驱动管理功能,无需手动设置系统属性。修改代码如下:
package com.example.printondemandsellerview; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class AmazonMerchScraper { public static void main(String[] args) { // 无需手动设置驱动路径,自动匹配浏览器版本 ChromeOptions options = new ChromeOptions(); WebDriver driver = new ChromeDriver(options); driver.get("https://merch.amazon.com/"); WebElement signInButton = driver.findElement(By.id("merch-nav-sign-in")); signInButton.click(); driver.quit(); } }
4. 清理Maven缓存并重新构建
执行以下命令清理本地Maven缓存,避免依赖损坏:
mvn clean install -U
5. 确认Java版本配置
Selenium 4.5.3支持Java 8及以上,你的项目使用Java 11没问题,但要确保IDE中的项目SDK配置正确指向Java 11。
内容的提问来源于stack exchange,提问作者Maik
相关产品推荐
相关产品推荐

