Selenium-TestNG-Maven - 获取“java.lang.NoClassDefFoundError:org/openqa/selenium/firefox/FirefoxDriver”
Posted
技术标签:
【中文标题】Selenium-TestNG-Maven - 获取“java.lang.NoClassDefFoundError:org/openqa/selenium/firefox/FirefoxDriver”【英文标题】:Selenium-TestNG-Maven - Getting "java.lang.NoClassDefFoundError: org/openqa/selenium/firefox/FirefoxDriver" 【发布时间】:2018-11-16 17:24:05 【问题描述】:这是我第一个使用 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 test 运行时,这绝对可以正常工作。
但是当通过 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>
非常感谢任何帮助。
【问题讨论】:
selenium-firefox-driver
包含在selenium-java
中。有关更多信息,请参阅此页面上的图形:docs.seleniumhq.org/download/maven.jsp
您不需要设置壁虎驱动程序路径。拿出来。
我尝试采用 gecko 驱动程序路径,但它不允许,因为它是一个语法错误。
【参考方案1】:
什么是 NoClassDefFoundError
Java 中的NoClassDefFoundError 发生在 JVM 无法在 runtime 找到特定的类时,该类在 编译时可用。例如,如果我们已经解决了来自 Class 的方法调用或访问了 Class 的任何静态成员,并且 Class 在 Class 期间不可用em>runtime 然后 JVM 将抛出 NoClassDefFoundError。
您看到的错误是:
java.lang.NoClassDefFoundError: org/openqa/selenium/firefox/FirefoxDriver
这清楚地表明Selenium
正在尝试在运行时从不可用的org/openqa/selenium/firefox/FirefoxDriver
解析特定的FirefoxDriver Class。
出了什么问题:
如果存在多个来源来通过JDK
/Maven
/Gradle
解析类和方法,则会出现这种情况强>。
从 pom.xml 可以清楚地看出,您已经为 FirefoxDriver Class 添加了多个依赖项,如下所示:
<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 将下载配置文件中提到的所有依赖项(例如pom.xml
)以解析 Classes 和 Methods。
如果在 Java 项目 中使用 Selenium JAR,则仅在 Java 构建路径 中添加必需的 External 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
您可以在以下位置找到相关讨论:
Exception in thread “main” java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver How to solve java.lang.NoClassDefFoundError? Selenium java.lang.NoClassDefFoundError: com/google/common/base/Function【讨论】:
【参考方案2】:我使用的是 eclipse 09-2019,它是最新安装的 JDK 13 和最新的 selenium jar 文件 3.141.59,在尝试了类似问题的所有答案后,我安装了其他 JDK 来解决这个问题。然后经过 4 天的尝试,安装了 eclipse neon 版本(https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-java-neon-3-win32-x86_64.zip&mirror_id=105)并使用了 Selenium-Java 3.5.2 jar 文件(https://jar-download.com/artifacts/org.seleniumhq.selenium/selenium-java/3.5.2/source-code),现在它可以完美地运行 Alhamdullilah。 另外我不知道错误的根本原因是什么,或者根本不知道,但现在它已经解决了。 希望对你有帮助
【讨论】:
以上是关于Selenium-TestNG-Maven - 获取“java.lang.NoClassDefFoundError:org/openqa/selenium/firefox/FirefoxDriver”的主要内容,如果未能解决你的问题,请参考以下文章