Selenium 4中EdgeOptions初始化报错:NoClassDefFoundError求助
问题:Selenium 4.x.x中使用EdgeOptions添加扩展时出现NoClassDefFoundError异常
使用Selenium 4.x.x版本,需求是通过EdgeOptions在运行脚本前为浏览器添加扩展,但始终抛出java.lang.NoClassDefFoundError: org/openqa/selenium/remote/AbstractDriverOptions异常,请求检查是否存在依赖版本不匹配或错误。
报错堆栈
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.remote.AbstractDriverOptions at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method)
pom.xml依赖配置
<dependencies> <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-api</artifactId> <version>4.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-chrome-driver --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>4.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-chromium-driver --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chromium-driver</artifactId> <version>4.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-edge-driver --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-edge-driver</artifactId> <version>4.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-remote-driver --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-remote-driver</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-junit</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-java</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-support</artifactId> <version>3.14.0</version> </dependency> </dependencies>
Driver初始化代码
public static WebDriver initializeDriver() throws IOException { WebDriver driver = null; Properties prop = ConfigTestData.prop; String browser = prop.getProperty("proj.browser"); if (browser.equalsIgnoreCase("Chrome")) { System.setProperty("webdriver.chrome.driver", prop.getProperty("proj.browser.driver.exe.path")); ChromeOptions opt = new ChromeOptions(); opt.addArguments("--log-level=2"); driver = new ChromeDriver(opt); } else if (browser.equalsIgnoreCase("Edge")) { System.setProperty("webdriver.edge.driver", prop.getProperty("proj.browser.driver.exe.path")); EdgeOptions options = new EdgeOptions(); driver = new EdgeDriver(options);//此处报错 } else { System.out.println("Mentioned driver does not exist.Please set either chrome or MS edge"); } return driver; }
解决方案
核心问题
异常的根本原因是Selenium依赖版本不统一:
selenium-remote-driver使用了3.4.0版本,而其他核心Selenium组件都是4.1.1selenium-support使用了3.14.0版本,同样与4.1.1版本不兼容
AbstractDriverOptions是Selenium 4.x新增的类,低版本的selenium-remote-driver中不存在该类,导致类加载失败。
修复步骤
- 统一所有Selenium依赖版本:将
selenium-remote-driver和selenium-support的版本改为4.1.1,与其他组件保持一致。 - 清理冗余依赖:
selenium-java已经包含了selenium-api、selenium-chrome-driver、selenium-edge-driver等核心组件,无需单独引入这些依赖,可以删除以避免冲突。
修正后的pom.xml示例
<dependencies> <!-- 核心Selenium依赖,包含所有必需的组件 --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.1.1</version> </dependency> <!-- 测试相关依赖 --> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-junit</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-java</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
- 清理并重建项目:执行
mvn clean install命令,确保依赖正确下载并覆盖旧版本。
补充优化
Selenium 4.x推荐使用WebDriverManager自动管理驱动,无需手动设置System.setProperty,可以简化初始化代码:
import io.github.bonigarcia.wdm.WebDriverManager; public static WebDriver initializeDriver() throws IOException { WebDriver driver = null; Properties prop = ConfigTestData.prop; String browser = prop.getProperty("proj.browser"); if (browser.equalsIgnoreCase("Chrome")) { WebDriverManager.chromedriver().setup(); ChromeOptions opt = new ChromeOptions(); opt.addArguments("--log-level=2"); driver = new ChromeDriver(opt); } else if (browser.equalsIgnoreCase("Edge")) { WebDriverManager.edgedriver().setup(); EdgeOptions options = new EdgeOptions(); // 添加扩展:options.addExtensions(new File("path/to/extension.crx")); driver = new EdgeDriver(options); } else { System.out.println("Mentioned driver does not exist.Please set either chrome or MS edge"); } return driver; }
需要添加WebDriverManager依赖到pom.xml:
<dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>5.3.0</version> </dependency>
内容的提问来源于stack exchange,提问作者Sumit Soni
相关产品推荐
相关产品推荐

