首页 > 解决方案 > 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>

任何帮助都深表感谢。

标签: mavenseleniumselenium-webdriver

解决方案


什么是 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 文件

从上面提到的所有观点来看,很明显相关的ClassMethods编译时从一个源解决,而在运行时不可用。

解决方案 :

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

  • 在使用构建工具(例如MavenGradle)时,从Java 构建路径中删除所有外部 JARMavenGradle将下载配置文件中提到的所有依赖项(例如)以解析ClassesMethodspom.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

您可以在以下位置找到相关讨论:


推荐阅读