2

我在 intellij 中使用 HtmlUnitDriver 编写了一个测试。代码是:

import junit.framework.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class HtmlUnitDemo {
    WebDriver driver;

    public static void main(String args[]){
        HtmlUnitDemo obj = new HtmlUnitDemo();
        obj.setup();
        obj.openURL();
    }

    public void openURL() {

        driver.get("https://mail.google.com");
        driver.findElement(By.id("username")).sendKeys("xyz");
        driver.findElement(By.id("password")).sendKeys("pqr");
        driver.findElement(By.className("btn-submit")).click();
        Assert.assertEquals(driver.getTitle(), "CAS – Central Authentication Service");
    }

    public void setup(){
        driver = new HtmlUnitDriver();
    }
}

此代码在我使用 gradle 时构建。但是,当我在 IDE 中运行它时,它给了我一个

*java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>(Ljava/lang/String;ILorg/apache/http/conn/scheme/SchemeSocketFactory;)

整个堆栈跟踪是:

at com.gargoylesoftware.htmlunit.HttpWebConnection.createHttpClient(HttpWebConnection.java:504)
at com.gargoylesoftware.htmlunit.HttpWebConnection.getHttpClient(HttpWebConnection.java:470)
at com.gargoylesoftware.htmlunit.HttpWebConnection.setUseInsecureSSL(HttpWebConnection.java:659)
at com.gargoylesoftware.htmlunit.WebClient.setUseInsecureSSL(WebClient.java:1085)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.createWebClient(HtmlUnitDriver.java:263)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.<init>(HtmlUnitDriver.java:129)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.<init>(HtmlUnitDriver.java:172)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.<init>(HtmlUnitDriver.java:168)
at smoke.com.thoughtworks.twu.HtmlUnitDemo.setup(HtmlUnitDemo.java:30)
at smoke.com.thoughtworks.twu.HtmlUnitDemo.main(HtmlUnitDemo.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我用谷歌搜索了这个错误,它说的是与类路径有关的内容。但我不确定到底要做什么。我对这个领域很陌生。因此,任何帮助将不胜感激。先感谢您。

4

3 回答 3

1

NoSuchMethodError可能表明该类所在的库org.apache.http.conn.scheme.Scheme具有与预期不同的版本。

检查您正在使用的 Selenium 库使用的依赖项。如果它来自 maven,这可能是一项简单的任务,否则请查看他们的网站。

于 2012-10-29T11:34:18.917 回答
1

我有同样的错误,我很难解决。

java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>(Ljava/lang/String;ILorg/apache/http/conn/scheme/SchemeSocketFactory;)

我的 Classpath 上有两个具有相同“完全限定”名称的类

org.apache.http.conn.scheme.Scheme

Java 只是选择了第一个 Scheme 类,它是错误的。它使用没有我期望的方法的 Scheme 类。

好的,所以我只需在 Maven 中声明正确的依赖项即可解决问题,对吗?不,这两个 Scheme 类都在不同的工件中,一个是传递依赖,所以我不能完全删除。

解决方案我们必须手动覆盖 Maven,将我们想要使用的 Scheme 类的 Jar 放入 Tomcat 中。Tomcat 容器获取的依赖项在 Maven 依赖项之前加载。因此,将 Scheme 类 Jar 加载到您的 Web 容器中,这样您就可以保证首先找到它。

这些命令在分析时非常有用。

mvn dependency:analyze -o
mvn dependency:tree -o
于 2019-06-26T14:53:36.567 回答
-1

如果您使用的是 IntelJ IDE。确保您在项目详细信息中提供了正确的 JDK。您可以通过
按 Ctrl+Alt+Shift+S -> 将打开项目设置来检查它。点击项目。您可以在此处查看指定的 JDK。 项目设置页面 转到系统中的 JDK 路径。如果您使用的是 Windows 64 位版本。这将是

C:\Program Files\Java\
确保您指定的JDK在同一路径下也有对应的jre(JDK,JRE版本应该相同)。 JDK 在我的系统中

所以你可以看到我有jdk1.8.0_141,jre1.8.0_141。我已将此 jdk1.8.0_141 索引到我的 IntelJ。
当您检查时,如果您看到相应的 JRE 不存在。IntelJ 索引将不正确,它会导致您在问题中提到的此类错误。您可以从http://www.oracle.com/technetwork/java/javase/downloads/index.html
下载最新的 JDK 如果您在 Windows 上使用 .exe 版本的 JDK 并在您的系统中运行。它将自动在同一路径中安装 corresponsind jre。您可以将您的疑问放在评论中。会尽力帮助你。

之后回到 IntelJ。转到项目设置->项目。单击新建并选择并添加正确的 JDK。单击确定。然后转到您的程序。你可以看到 IntelJ 正在重新索引你的东西。可能需要几分钟。之后尝试重新运行程序。

于 2017-07-21T07:53:29.013 回答