【问题标题】:class not found with selenium and javaselenium 和 java 找不到类
【发布时间】:2018-09-21 02:31:55
【问题描述】:

我正在尝试学习 selenium webdriver,但遇到了问题。

我做了一个非常小的测试,看起来像这样:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Flows {

    public static void main(String[] args) {

        System.setProperty("webdriver.chrome.driver", "/Users/mn/Downloads/belikewater/chromedriver");
        WebDriver driver = new ChromeDriver();

        String baseUrl = "http://anywhere.c3a.dk/";


        driver.get(baseUrl);

        System.out.println(driver.getTitle());

        driver.close();

    }
}

我正在使用 gradle,它看起来像这样:

group 'com.cetrea'
version '1.0-SNAPSHOT'

apply plugin: 'java'

group = 'com.cetrea'
version = '1.0.0'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile('org.seleniumhq.selenium:selenium-java:2.41.0')
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

jar {
    manifest{
        attributes 'Main-Class': 'com.cetrea.flowtesting.Flows'
    }
}

我在

中遇到了异常
"main" java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.WebDriver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

我使用的是 Mac OS,并尝试过 brew install chromedriver,但我找不到它的路径,因为我对 mac 也很陌生,所以我下载了一个 zip 并将可执行的 chromedriver 复制到我的项目中。

也不记得如何获取完整的堆栈跟踪..

** 我一定是搞砸了什么。用右键单击流运行它,然后按运行 flow.main() 给了我另一个错误,所以至少它找到了它现在需要的东西。但是我收到以下错误。

Starting ChromeDriver (v2.8.241036) on port 47434
[warn] kq_init: detected broken kqueue; not using.: Undefined error: 0
May 07, 2018 11:39:22 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Exception in thread "main" org.openqa.selenium.WebDriverException: java.net.ConnectException: Failed to connect to localhost/0:0:0:0:0:0:0:1:47434
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-11T20:26:55.152Z'
System info: host: 'cetreas-MacBook-Pro.local', ip: 'fe80:0:0:0:c9e:2c67:1d27:4e0b%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.13.3', java.version: '1.8.0_161'
Driver info: driver.version: RemoteWebDriver
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:92)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:545)
    at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:273)
    at com.cetrea.flows.Flows.main(Flows.java:15)
Caused by: java.net.ConnectException: Failed to connect to localhost/0:0:0:0:0:0:0:1:47434
    at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:240)
    at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:158)
    at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:256)
    at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
    at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
    at okhttp3.RealCall.execute(RealCall.java:77)
    at org.openqa.selenium.remote.internal.OkHttpClient.execute(OkHttpClient.java:101)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:155)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    ... 3 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at okhttp3.internal.platform.Platform.connectSocket(Platform.java:125)
    at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:238)
    ... 23 more

会不会是防火墙之类的东西阻止了它?这是我借了半年的mac,所以我还没有完全习惯它。

【问题讨论】:

标签: java macos selenium selenium-webdriver classnotfoundexception


【解决方案1】:

你是如何运行它的?

我怀疑这不是 Selenium 问题。看起来很可疑,您正在运行您的应用程序,如下所示:java -jar your-jar-name.jar。但是您需要在类路径上提供所有必需的 jar。

一个简单的选择是将以下几行添加到您的 gradle 文件中

apply plugin: 'application'
mainClassName = "com.cetrea.flowtesting.Flows"

然后以gradle run运行它

或者你可以让 gradle 为你复制所有的依赖 jars,然后在你的类路径中提到它们。

如果您下载了正确的驱动程序,应该可以成功运行。尽管您可能仍需要一些依赖项,如 cmets.xml 中提到的答案中所建议的那样。但至少 org.openqa.selenium.WebDriver 应该已经在你的类路径中了。

【讨论】:

  • 嗯,我使用 intellij 作为 jar 来运行它,并首先包含 gradle build 任务。我应该添加它而不是 jar{} 吗?
  • 我不记得 IntelliJ 中的 jar 运行选项在哪里,但我想它应该与命令行中的 java -jar 相同(只会在类路径中看到您自己的类,但不会依赖项)。使用 IntelliJ,您可以如上所述将“应用程序”插件添加到您的 build.gradle 文件中,然后将其作为 gradle 任务运行。或者您可以在 Project 窗口中找到 Flows 类,鼠标右键单击并选择 Run Flows.main()。如果您将 IntelliJ 项目创建为基于 gradle 的,它应该正确解析类路径。
  • 创建一个新文件夹,将您的源代码复制到该文件夹​​,创建新的 IntelliJ“现有源项目”,选择您的新文件夹,选择“从现有模型导入项目”并选择 gradle。然后,您无需配置任何自定义运行或构建命令。 IntelliJ 将知道如何正确构建或运行它。即使没有(例如,如果您在运行之前在 gradle 文件中进行了一些自定义设置),您始终可以直接从 IntelliJ 运行 gradle 任务,并且您不会失去使用 IDE 的任何好处(例如,您仍然可以调试你的代码)。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2021-02-11
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多