【问题标题】:NoClassDefFoundError with chromedriverNoClassDefFoundError 与 chromedriver
【发布时间】:2022-01-11 11:09:17
【问题描述】:

当我尝试使用 chromedriver 运行测试时出现此错误:

org.gradle.api.internal.tasks.testing.TestSuiteExecutionException:无法完成 Gradle Test Executor 30 的执行。 在 org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) 在 java.base@16.0.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 java.base@16.0.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) 在 java.base@16.0.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base@16.0.1/java.lang.reflect.Method.invoke(Method.java:567) 在 org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) 在 org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 在 org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) 在 org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) 在 jdk.proxy1/jdk.proxy1.$Proxy2.stop(未知来源) 在 org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) 在 org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) 在 org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) 在 org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) 在 org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) 在 org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133) 在 org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) 在 app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) 在应用程序//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) 原因:org.junit.platform.commons.JUnitException:带有 ID 'junit-jupiter' 的 TestEngine 未能发现测试 在 org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:111) 在 org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:85) 在 org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:92) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) 在 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) 在 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) 在 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) 在 org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) ... 18 更多 引起:org.junit.platform.commons.JUnitException: ClassSelector [className = 'com.paulcarron.learningspringboot.learningspringboot.EndToEndTests'] 解析失败 在 org.junit.platform.launcher.listeners.discovery.AbortOnFailureLauncherDiscoveryListener.selectorProcessed(AbortOnFailureLauncherDiscoveryListener.java:39) 在 org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:102) 在 org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.run(EngineDiscoveryRequestResolution.java:82) 在 org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.resolve(EngineDiscoveryRequestResolver.java:113) 在 org.junit.jupiter.engine.discovery.DiscoverySelectorResolver.resolveSelectors(DiscoverySelectorResolver.java:45) 在 org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:69) 在 org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:103) ... 25 更多 引起:java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver 在 java.base/java.lang.Class.getDeclaredMethods0(本机方法) 在 java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3334) 在 java.base/java.lang.Class.privateGetPublicMethods(Class.java:3359) 在 java.base/java.lang.Class.getMethods(Class.java:1990) 在 org.junit.platform.commons.util.ReflectionUtils.getDefaultMethods(ReflectionUtils.java:1481) 在 org.junit.platform.commons.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:1454) 在 org.junit.platform.commons.util.ReflectionUtils.findMethod(ReflectionUtils.java:1304) 在 org.junit.platform.commons.util.ReflectionUtils.isMethodPresent(ReflectionUtils.java:1205) 在 org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests.hasTestOrTestFactoryOrTestTemplateMethods(IsTestClassWithTests.java:50) 在 org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests.test(IsTestClassWithTests.java:46) 在 org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:67) 在 org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve$2(EngineDiscoveryRequestResolution.java:134) 在 java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) 在 java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602) 在 java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) 在 java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502) 在 java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488) 在 java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) 在 java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) 在 java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 在 java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) 在 org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:185) 在 org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:125) 在 org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:91) ... 30 更多 引起:java.lang.ClassNotFoundException:org.openqa.selenium.WebDriver 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519) ... 54 更多

我将chromedriver 部署到了 ext 文件夹,并为我的浏览器提供了正确的版本。什么会导致这个问题?它似乎来自@BeforeClass,如下所示:

@BeforeClass
public static void setUp() throws IOException {

    System.setProperty("webdriver.chrome.driver", "ext/chromedriver");
    service = createDefaultService();
    driver = new ChromeDriver(service);
    Path testResults = Paths.get("build", "test-results");
    if (!Files.exists(testResults)) {
        Files.createDirectory(testResults);
    }
}

【问题讨论】:

  • 我希望System.setProperty("webdriver.chrome.driver", "ext/chromedriver") 中的ext/chromedriver 不是硬编码字符串?

标签: java selenium testing automated-tests selenium-chromedriver


【解决方案1】:

NoClassDefFoundError

NoClassDefFoundError 发生在 JVM 无法在运行时找到编译时可用的特定类时。例如,如果我们从一个类解析了一个方法调用或访问了一个类的任何静态成员,并且该类在运行时不可用,那么 JVM 将抛出 NoClassDefFoundError

您看到的错误是:

java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver at java.base/java.lang.Class.getDeclaredMethods0(Native Method)

这清楚地表明 Selenium 正在尝试在运行时从 org/openqa/selenium/WebDriver 解析特定的类,而该类不再可用。


解决办法:

System.setProperty() 行中,您需要传递ChromeDriver 的绝对路径,如下所示:

System.setProperty("webdriver.chrome.driver", "/complete/path/to/chromedriver");

参考文献

您可以在以下位置找到一些相关的详细讨论:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多