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 的任何静态成员,并且 ClassClass 期间不可用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 添加了多个依赖项,如下所示:

&lt;artifactId&gt;selenium-java&lt;/artifactId&gt;

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.12.0</version>
    <scope>test</scope>
</dependency>

&lt;artifactId&gt;selenium-firefox-driver&lt;/artifactId&gt;

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-firefox-driver</artifactId>
    <version>3.12.0</version>
</dependency>

&lt;artifactId&gt;selenium-server&lt;/artifactId&gt;

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-server</artifactId>
    <version>3.12.0</version>
</dependency>

此外,您还添加了所有 jar 文件

从上述所有点来看,很明显相关的 ClassMethods编译时从一个来源解决运行时期间不可用。

解决办法:

以下是解决NoClassDefFoundError的几个步骤:

使用构建工具时,例如MavenGradleJava 构建路径删除所有外部 JARMavenGradle 将下载配置文件中提到的所有依赖项(例如 pom.xml)以解析 ClassesMethods。 如果在 Java 项目 中使用 Selenium JAR,则仅在 Java 构建路径 中添加必需的 External JAR 和删除未使用和重复的外部 JAR。 如果您使用 FirefoxDriver,请使用 &lt;artifactId&gt;selenium-java&lt;/artifactId&gt;&lt;artifactId&gt;selenium-server&lt;/artifactId&gt;。避免同时使用两者。 从 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”的主要内容,如果未能解决你的问题,请参考以下文章

RPC街舞获邀盘州市街舞比赛分别取得了...

Spotify API 只获得了一些设备,但我的手机获得了所有设备

帮助您了解什么是运营商大数据获客

AI写作《如何利用 RPA 实现自动化获客?》

七牛云实力再获认可获“2021卓越竞争力云计算先锋企业”奖

国家“十三五”重点出版规划获批