Selenium 3.3.1:NoDefClassFound (com.google.common.base.Function) [英] Selenium 3.3.1: NoDefClassFound (com.google.common.base.Function)

查看:85
本文介绍了Selenium 3.3.1:NoDefClassFound (com.google.common.base.Function)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了最奇怪的问题,在 Selenium 3.3.1 中,尝试使用最简单的代码启动 ChromeDriver(或 FirefoxDriver)时:

编辑:添加完整的类

import java.util.concurrent.TimeUnit;导入 org.openqa.selenium.WebDriver;导入 org.openqa.selenium.chrome.ChromeDriver;公共类应用{公共静态无效主(字符串 [] args){//testCrawl();硒GetDoc();}公共静态无效硒GetDoc(){System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver 驱动程序 = new ChromeDriver();//这里发生了严重的错误driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);driver.get("https://google.com/");String htmlContent = driver.getPageSource();System.out.println(driver.getCurrentUrl());}}

在我的 pom 中有以下依赖项:

 <依赖><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.3.1</version></依赖><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server --><依赖><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-server</artifactId><version>3.3.1</version></依赖>

我获得以下输出:

线程main"中的异常 java.lang.NoClassDefFoundError: com/google/common/base/Function在 my.package.MyClass.seleniumGetDoc(CrawlerMain.java:28)在 my.package.MyClass.main(CrawlerMain.java:22)引起:java.lang.ClassNotFoundException:com.google.common.base.Function在 java.net.URLClassLoader.findClass(URLClassLoader.java:381)在 java.lang.ClassLoader.loadClass(ClassLoader.java:424)在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)

尽管如此,在降级我的 selenium 版本时,它可以正常使用以下依赖项:

 <依赖><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>2.45.0</version></依赖><依赖><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-server</artifactId><version>3.0.1</version></依赖>

有谁知道为什么在 3.3.1 版本中显然缺少一些番石榴库?或者我在设置 Selenium 时错过了什么?

我查看了 StackOverflow 上的几篇文章,但是问题要么与外部 jar 的安装缺失(maven 应该处理)有关,要么与 selenium-server 的依赖缺失有关.>

编辑我的依赖列表:

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --><依赖><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version></依赖><依赖><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.3.1</version></依赖><依赖><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-server</artifactId><version>3.3.1</version></依赖><依赖><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8</version></依赖><依赖><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8</version></依赖><依赖><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><范围>测试</范围></依赖></依赖项>

同样在运行 mvn dependency:tree 时,maven 表示只有 selenium-java 依赖于 com.google.guava:guava:jar:21.0:compile

编辑添加我的依赖树:

[INFO] org.linkedin.crawler:main:jar:0.0.1-SNAPSHOT[信息] +- org.jsoup:jsoup:jar:1.10.2:compile[信息] +- org.seleniumhq.selenium:selenium-java:jar:3.3.1:compile[信息] |+- org.seleniumhq.selenium:selenium-chrome-driver:jar:3.3.1:compile[信息] ||\- org.seleniumhq.selenium:selenium-remote-driver:jar:3.3.1:compile[信息] ||+- org.seleniumhq.selenium:selenium-api:jar:3.3.1:compile[信息] ||+- cglib:cglib-nodep:jar:3.2.4:compile[信息] ||+- org.apache.commons:commons-exec:jar:1.3:compile[信息] ||+- com.google.code.gson:gson:jar:2.8.0:compile[信息] ||+- com.google.guava:guava:jar:21.0:compile[信息] ||+- org.apache.httpcomponents:httpclient:jar:4.5.2:compile[信息] |||\- org.apache.httpcomponents:httpcore:jar:4.4.4:compile[信息] ||\- net.java.dev.jna:jna-platform:jar:4.1.0:compile[信息] ||\- net.java.dev.jna:jna:jar:4.1.0:compile[信息] |+- org.seleniumhq.selenium:selenium-edge-driver:jar:3.3.1:compile[信息] |+- org.seleniumhq.selenium:selenium-firefox-driver:jar:3.3.1:compile[信息] |+- org.seleniumhq.selenium:selenium-ie-driver:jar:3.3.1:compile[信息] |+- org.seleniumhq.selenium:selenium-opera-driver:jar:3.3.1:compile[信息] |+- org.seleniumhq.selenium:selenium-safari-driver:jar:3.3.1:compile[信息] |+- com.codeborne:phantomjsdriver:jar:1.4.0:compile[信息] |\- org.seleniumhq.selenium:htmlunit-driver:jar:2.24:compile[信息] |+- org.seleniumhq.selenium:selenium-support:jar:3.3.1:compile (从约束[2.53.0,4.0.0)中选择的版本)[信息] ||\- org.hamcrest:hamcrest-library:jar:1.3:compile[信息] |\- net.sourceforge.htmlunit:htmlunit:jar:2.24:compile[信息] |+- xalan:xalan:jar:2.7.2:compile[信息] ||\- xalan:serializer:jar:2.7.2:compile[信息] |+- org.apache.commons:commons-lang3:jar:3.5:compile[信息] |+- org.apache.httpcomponents:httpmime:jar:4.5.2:compile[信息] |+- commons-codec:commons-codec:jar:1.10:compile[信息] |+- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.23:compile[信息] |+- net.sourceforge.htmlunit:neko-htmlunit:jar:2.24:compile[信息] ||\- xerces:xercesImpl:jar:2.11.0:compile[信息] ||\- xml-apis:xml-apis:jar:1.4.01:compile[信息] |+- net.sourceforge.cssparser:cssparser:jar:0.9.21:compile[信息] ||\- org.w3c.css:sac:jar:1.3:compile[信息] |+- commons-io:commons-io:jar:2.5:compile[信息] |+- commons-logging:commons-logging:jar:1.2:compile[信息] |\- org.eclipse.jetty.websocket:websocket-client:jar:9.2.20.v20161216:compile[信息] |+- org.eclipse.jetty:jetty-util:jar:9.2.20.v20161216:compile[信息] |+- org.eclipse.jetty:jetty-io:jar:9.2.20.v20161216:compile[信息] |\- org.eclipse.jetty.websocket:websocket-common:jar:9.2.20.v20161216:compile[信息] |\- org.eclipse.jetty.websocket:websocket-api:jar:9.2.20.v20161216:compile[信息] +- org.seleniumhq.selenium:selenium-server:jar:3.3.1:compile[信息] |+- com.beust:jcommander:jar:1.48:compile[信息] |+- net.jcip:jcip-annotations:jar:1.0:compile[信息] |+- org.seleniumhq.selenium:jetty-repacked:jar:9.4.1.v20170120:compile[信息] ||\- javax.servlet:javax.servlet-api:jar:3.1.0:compile[信息] |\- org.yaml:snakeyaml:jar:1.15:compile[信息] +- org.apache.logging.log4j:log4j-api:jar:2.8:compile[信息] +- org.apache.logging.log4j:log4j-core:jar:2.8:compile[信息] \- junit:junit:jar:4.12:test[信息] \- org.hamcrest:hamcrest-core:jar:1.3:compile

更新:它适用于 selenium-server 版本 3.3.1 和 selenium-java 版本 3.0.1,来自 selenium-java 版本 >3.1.x 它开始破坏与上述相同的错误

编辑添加我的完整 pom:

<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>org.main.groupid</groupId><artifactId>main</artifactId><version>0.0.1-SNAPSHOT</version><包装>罐</包装><name>main</name><url>http://maven.apache.org</url><属性><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></属性><构建><插件><插件><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.0.0</version><执行><执行><id>复制依赖</id><phase>包</phase><目标><目标>复制依赖</目标></目标><配置><outputDirectory>${project.build.directory}/lib/</outputDirectory><overWriteReleases>false</overWriteReleases><overWriteSnapshots>false</overWriteSnapshots><overWriteIfNewer>true</overWriteIfNewer></配置></执行></执行></插件><插件><!-- 构建一个可执行的 JAR --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version><配置><存档><清单><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>my.main.Class</mainClass></清单></存档><排除><exclude>**/*log4j*</exclude></排除></配置></插件></plugins></build><依赖项><依赖><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version></依赖><依赖><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.3.1</version></依赖><依赖><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-server</artifactId><version>3.3.1</version></依赖><依赖><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8</version></依赖><依赖><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8</version></依赖><依赖><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><范围>测试</范围></依赖></依赖项></项目>

解决方案

我遇到了类似的问题,并将其缩小到包括 Selenium 3.3.1 Standalone 和 HTMLUnit-driver-standalone 2.21.结果我根本不需要 HTMLUnit jar.它已经包含在 3.3.1 依赖项中.(如果我没记错的话,上一个版本没有包含 HTMLUnit,这就是我之前单独添加它的原因……这可能解释了 > 3.01 部分.)

现在,我不使用 Selenium-java 部分......只是独立服务器,但看起来你有 2 个 HTMLUnit 版本......在你的 dep 列表中是 2.24 和 2.23,所以它可能是一个类似的问题.

I have the strangest problem, with Selenium 3.3.1, when trying to start a ChromeDriver (or FirefoxDriver), with the simplest code:

Edit: added the full class

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class App {
    public static void main(String[] args) {
        // testCrawl();
        seleniumGetDoc();
    }

    public static void seleniumGetDoc() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver(); //here something goes terribly wrong
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        driver.get("https://google.com/");
        String htmlContent = driver.getPageSource();
        System.out.println(driver.getCurrentUrl());
    }
}

With the following dependencies in my pom:

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.3.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>3.3.1</version>
    </dependency>

I obtain the following output:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function
    at my.package.MyClass.seleniumGetDoc(CrawlerMain.java:28)
    at  my.package.MyClass.main(CrawlerMain.java:22)
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Function
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

Nonetheless when downgrading my selenium versions, it works properly with the following dependencies:

   <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.45.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>3.0.1</version>
    </dependency>

Does anyone knows why apparently in the 3.3.1 version some guava library is missing? Or have I missed something in setting up Selenium?

I have looked at several posts on StackOverflow, however the problem is either linked to the missing installation of external jars (which maven should handle) or to the dependency missing of selenium-server.

Edit my list of dependencies:

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.10.2</version>
    </dependency>

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

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.8</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Also when running mvn dependency:tree, maven indicates that only selenium-java depends on com.google.guava:guava:jar:21.0:compile

Edit adding my dependency tree:

[INFO] org.linkedin.crawler:main:jar:0.0.1-SNAPSHOT
[INFO] +- org.jsoup:jsoup:jar:1.10.2:compile
[INFO] +- org.seleniumhq.selenium:selenium-java:jar:3.3.1:compile
[INFO] |  +- org.seleniumhq.selenium:selenium-chrome-driver:jar:3.3.1:compile
[INFO] |  |  \- org.seleniumhq.selenium:selenium-remote-driver:jar:3.3.1:compile
[INFO] |  |     +- org.seleniumhq.selenium:selenium-api:jar:3.3.1:compile
[INFO] |  |     +- cglib:cglib-nodep:jar:3.2.4:compile
[INFO] |  |     +- org.apache.commons:commons-exec:jar:1.3:compile
[INFO] |  |     +- com.google.code.gson:gson:jar:2.8.0:compile
[INFO] |  |     +- com.google.guava:guava:jar:21.0:compile
[INFO] |  |     +- org.apache.httpcomponents:httpclient:jar:4.5.2:compile
[INFO] |  |     |  \- org.apache.httpcomponents:httpcore:jar:4.4.4:compile
[INFO] |  |     \- net.java.dev.jna:jna-platform:jar:4.1.0:compile
[INFO] |  |        \- net.java.dev.jna:jna:jar:4.1.0:compile
[INFO] |  +- org.seleniumhq.selenium:selenium-edge-driver:jar:3.3.1:compile
[INFO] |  +- org.seleniumhq.selenium:selenium-firefox-driver:jar:3.3.1:compile
[INFO] |  +- org.seleniumhq.selenium:selenium-ie-driver:jar:3.3.1:compile
[INFO] |  +- org.seleniumhq.selenium:selenium-opera-driver:jar:3.3.1:compile
[INFO] |  +- org.seleniumhq.selenium:selenium-safari-driver:jar:3.3.1:compile
[INFO] |  +- com.codeborne:phantomjsdriver:jar:1.4.0:compile
[INFO] |  \- org.seleniumhq.selenium:htmlunit-driver:jar:2.24:compile
[INFO] |     +- org.seleniumhq.selenium:selenium-support:jar:3.3.1:compile (version selected from constraint [2.53.0,4.0.0))
[INFO] |     |  \- org.hamcrest:hamcrest-library:jar:1.3:compile
[INFO] |     \- net.sourceforge.htmlunit:htmlunit:jar:2.24:compile
[INFO] |        +- xalan:xalan:jar:2.7.2:compile
[INFO] |        |  \- xalan:serializer:jar:2.7.2:compile
[INFO] |        +- org.apache.commons:commons-lang3:jar:3.5:compile
[INFO] |        +- org.apache.httpcomponents:httpmime:jar:4.5.2:compile
[INFO] |        +- commons-codec:commons-codec:jar:1.10:compile
[INFO] |        +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.23:compile
[INFO] |        +- net.sourceforge.htmlunit:neko-htmlunit:jar:2.24:compile
[INFO] |        |  \- xerces:xercesImpl:jar:2.11.0:compile
[INFO] |        |     \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] |        +- net.sourceforge.cssparser:cssparser:jar:0.9.21:compile
[INFO] |        |  \- org.w3c.css:sac:jar:1.3:compile
[INFO] |        +- commons-io:commons-io:jar:2.5:compile
[INFO] |        +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |        \- org.eclipse.jetty.websocket:websocket-client:jar:9.2.20.v20161216:compile
[INFO] |           +- org.eclipse.jetty:jetty-util:jar:9.2.20.v20161216:compile
[INFO] |           +- org.eclipse.jetty:jetty-io:jar:9.2.20.v20161216:compile
[INFO] |           \- org.eclipse.jetty.websocket:websocket-common:jar:9.2.20.v20161216:compile
[INFO] |              \- org.eclipse.jetty.websocket:websocket-api:jar:9.2.20.v20161216:compile
[INFO] +- org.seleniumhq.selenium:selenium-server:jar:3.3.1:compile
[INFO] |  +- com.beust:jcommander:jar:1.48:compile
[INFO] |  +- net.jcip:jcip-annotations:jar:1.0:compile
[INFO] |  +- org.seleniumhq.selenium:jetty-repacked:jar:9.4.1.v20170120:compile
[INFO] |  |  \- javax.servlet:javax.servlet-api:jar:3.1.0:compile
[INFO] |  \- org.yaml:snakeyaml:jar:1.15:compile
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.8:compile
[INFO] +- org.apache.logging.log4j:log4j-core:jar:2.8:compile
[INFO] \- junit:junit:jar:4.12:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:compile

Update: It works with selenium-server with version 3.3.1 and selenium-java version 3.0.1, from selenium-java version >3.1.x it starts breaking with the same afore mentioned error

Edit Adding my full pom:

<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>org.main.groupid</groupId>
    <artifactId>main</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>main</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib/</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>my.main.Class</mainClass>
                        </manifest>
                    </archive>
                    <excludes>
                        <exclude>**/*log4j*</exclude>
                    </excludes>
                </configuration>
            </plugin>


        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-server</artifactId>
            <version>3.3.1</version>
        </dependency>



        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

解决方案

I was having similar issues, and narrowed it down to including both Selenium 3.3.1 Standalone and HTMLUnit-driver-standalone 2.21. Turns out I didn't need the HTMLUnit jar at all. It's already included in 3.3.1 dependencies. (If I remember right the last version did not include HTMLUnit which is why I had added it separately before... this may explain the > 3.01 part.)

Now, I don't use the Selenium-java part... just the standalone server, but it looks like you have 2 HTMLUnit versions... 2.24 and 2.23 in your dep list so it could be a similar issue.

这篇关于Selenium 3.3.1:NoDefClassFound (com.google.common.base.Function)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆