maven - Selenium-TestNG-Maven - 获取“java.lang.NoClassDefFoundError:org/openqa/selenium/firefox/FirefoxDriver”
问题描述
这是我第一个使用 TestNG 和 Maven 的 selenium 脚本。创建了一个简单的“Hello World”代码和一个硒测试代码,它只检查谷歌页面的标题。
下面带有 TestNG 的 Selenium 代码:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
public class HelloTest {
@Test
public void testOne() {
//WebDriver d=new FirefoxDriver();
System.setProperty("webdriver.gecko.driver","D:\\Firefox Driver\\geckodriver-v0.17.0-win64\\geckodriver.exe");
WebDriver d=new FirefoxDriver();
d.get("https://www.google.com");
System.out.println("This is first TestNG");
}
}
当通过 eclipse - Run As - Test NG 测试运行时,这绝对可以正常工作。
但是当通过 Maven - mvn clean install 从 cmd 提示符运行时,我遇到了错误
T E S T S
-------------------------------------------------------
Running HelloTest
Configuring TestNG with: TestNG652Configurator
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.94 sec <<< FAILURE! - in HelloTest
testOne(HelloTest) Time elapsed: 0.032 sec <<< FAILURE!
java.lang.NoClassDefFoundError: org/openqa/selenium/firefox/FirefoxDriver
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at HelloTest.testOne(HelloTest.java:11)
它在 处显示错误WebDriver d=new FirefoxDriver();
。不确定问题出在哪里。添加了所有 jar 文件,检查了构建路径,所有的 jar 都在那里。下面是我的 POM 文件。
<?xml version="1.0"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo.micky</groupId>
<artifactId>MavenDemoTwo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.12.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
<type>jar</type>
<version>15.0</version>
</dependency>
</dependencies>
</project>
任何帮助都深表感谢。
解决方案
什么是 NoClassDefFoundError
当JVM在运行时无法找到在编译时可用的特定类时,Java 中的NoClassDefFoundError就会发生。例如,如果我们已经解析了来自Class的方法调用或访问Class的任何静态成员,并且该Class在运行时不可用,则JVM将抛出NoClassDefFoundError。
您看到的错误是:
java.lang.NoClassDefFoundError: org/openqa/selenium/firefox/FirefoxDriver
这清楚地表明Selenium
正在尝试在运行时解析不可用的特定FirefoxDriver 类org/openqa/selenium/firefox/FirefoxDriver
。
什么地方出了错 :
如果存在多个通过JDK
//解析类Maven
和方法的源,则会出现这种情况Gradle
。
从pom.xml中可以清楚地看到,您已经为FirefoxDriver 类添加了多个依赖项,如下所示:
<artifactId>selenium-java</artifactId>
:<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.12.0</version> <scope>test</scope> </dependency>
<artifactId>selenium-firefox-driver</artifactId>
:<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-firefox-driver</artifactId> <version>3.12.0</version> </dependency>
<artifactId>selenium-server</artifactId>
:<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> <version>3.12.0</version> </dependency>
此外,您还添加了所有 jar 文件。
从上面提到的所有观点来看,很明显相关的Class
或Methods
在编译时从一个源解决,而在运行时不可用。
解决方案 :
以下是解决NoClassDefFoundError的几个步骤:
- 在使用构建工具(例如Maven或Gradle)时,从Java 构建路径中删除所有外部 JAR。Maven或Gradle将下载配置文件中提到的所有依赖项(例如)以解析Classes和Methods。
pom.xml
- 如果在Java 项目中使用Selenium JAR ,则只在Java 构建路径中添加所需的外部 JAR ,并删除未使用和重复的外部 JAR。
- 如果您使用的是FirefoxDriver ,请使用
<artifactId>selenium-java</artifactId>
或<artifactId>selenium-server</artifactId>
. 避免同时使用两者。 - 删除不需要的和重复的从
pom.xml
- 通过IDE清理项目工作区并仅使用所需的依赖项重建项目。
- 使用CCleaner工具在执行测试套件之前和之后清除所有操作系统杂务。
- 如果您的基本Web Client版本太旧,请通过Revo Uninstaller卸载它并安装最新的 GA 和已发布版本的Web Client。
- 重新启动系统。
在执行Maven 项目时,请始终按顺序执行以下操作:
maven clean
maven install
maven test
您可以在以下位置找到相关讨论:
推荐阅读
- scala - 使用 Mill 或 SBT 在测试中运行时找不到 Scala 脚本引擎
- angular - Safari(Mac 和 iOS)上的 Angular 加载时间太长(太慢),比 Chrome(PC 和 Android)长得多
- c - __LINE__ 在宏定义中,代表宏调用的行
- scala - 我们可以在 Scala 中序列化更新的对象吗?
- python - 如何将 Dataframe 的第一行读取为数据行而不是标题
- javascript - CSS 捆绑不适用于 MiniCssExtract 插件和 css-loader (Webpack)
- javascript - 多个正则表达式/模式验证 Joi Hapi
- discord - Discord.py channel.edit 没有做任何事情,并且 bot 没有越过那条线
- amazon-web-services - 超出最大调用堆栈大小 - aws-cdk
- c++ - 使用 Opengl CORE 函数和 Comptability profile - GLFW