在maven项目中使用WebDriverManager运行ChromeDriver时出现异常

lyr7nygr  于 2022-12-26  发布在  Maven
关注(0)|答案(4)|浏览(249)

当我试图在Maven项目中使用WebDriverManager打开ChromeDriver时,我收到了一个异常。
我计划的框架倾向于在pom.xml中添加依赖项后从WebDriverManager中提取ChromeDriver,并打算使用Gauge执行测试。
在运行测试时,尝试为ChromeDriver创建新示例时发生错误。
以下是例外情况:

Error Message: java.lang.NoSuchMethodError: com.google.common.util.concurrent.SimpleTimeLimiter.create(Ljava/util/concurrent/ExecutorService;)Lcom/google/common/util/concurrent/SimpleTimeLimiter;
  Stacktrace: 
  org.openqa.selenium.net.UrlChecker.<init>(UrlChecker.java:64)
  org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:187)
  org.openqa.selenium.remote.service.DriverService.start(DriverService.java:178)
  org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:78)
  org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:646)
  org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:255)
  org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:237)
  org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:138)
  org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:178)
  org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:167)
  org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)
  StepTests.setupTest(StepTests.java:26)
  sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  java.lang.reflect.Method.invoke(Unknown Source)
  com.thoughtworks.gauge.execution.MethodExecutor.execute(MethodExecutor.java:38)
  com.thoughtworks.gauge.execution.HooksExecutor$TaggedHookExecutor.executeHook(HooksExecutor.java:102)
  com.thoughtworks.gauge.execution.HooksExecutor$TaggedHookExecutor.execute(HooksExecutor.java:88)
  com.thoughtworks.gauge.execution.HooksExecutor.execute(HooksExecutor.java:45)
  com.thoughtworks.gauge.processor.MethodExecutionMessageProcessor.executeHooks(MethodExecutionMessageProcessor.java:65)
  com.thoughtworks.gauge.processor.SpecExecutionStartingProcessor.process(SpecExecutionStartingProcessor.java:32)
  com.thoughtworks.gauge.connection.MessageDispatcher.dispatchMessages(MessageDispatcher.java:89)
  com.thoughtworks.gauge.GaugeRuntime.dispatchMessages(GaugeRuntime.java:104)
  com.thoughtworks.gauge.GaugeRuntime.access$100(GaugeRuntime.java:36)
  com.thoughtworks.gauge.GaugeRuntime$2.run(GaugeRuntime.java:85)
  java.lang.Thread.run(Unknown Source)

运行此代码时:

import com.thoughtworks.gauge.*;
import io.github.bonigarcia.wdm.ChromeDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import com.thoughtworks.gauge.Step;
import static org.junit.Assert.assertEquals;

public class StepTests {
//Holds the WebDriver instance
private WebDriver webDriver;

@BeforeSuite
public static void initializeDriver(){
    ChromeDriverManager.getInstance().setup();
}

@BeforeSpec
public void setupTest(){
    webDriver = new ChromeDriver();
}

--test code--


    @AfterSuite
    public void closeDriver(){
        if (webDriver != null) {
            webDriver.quit();
        }
    }
}

如果您需要了解更多信息以找到解决方案,请告知我。

bttbmeg0

bttbmeg01#

你在Guava中有一个版本冲突。Selenium WebDriver(不是WebDriverManager)依赖于Guava的一个给定版本,而你似乎在你的项目中使用了另一个版本。我会使用两者的最新版本。

b4qexyjb

b4qexyjb2#

是的,在添加Guava依赖项后为我工作:

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>
yzuktlbb

yzuktlbb3#

    • 一个
    • 第二个可能的解决方案**

仅当第一个解决方案无法解决问题时,才参考此答案。
我曾经面对过这个问题,但在SO上没有找到公认的答案。我通过阅读一个非SO链接并将其粘贴在这里以供将来参考来解决这个问题。

    • 我们得先找出问题所在**

如果您正在使用IntelliJ或Eclipse,则需要转到Run/Debug Configurations,并添加一个VM参数。

-ea -verbose:class

现在,重新运行你的测试。这将开始打印出类和那些类被导入和使用的jar。在你的特定情况下,如果你搜索SimpleTimeLimiter,你将看到它被导入的包。
由于包版本之间存在冲突,所以出现了这个错误。一个jar依赖项将引用一个更早的guava版本,并且这个jar将出现在类路径的早期。这将避免使用预期的类路径。更准确地说,可能有一些包导入guava的时间比您在pom.xml中编写的要早。

    • 这怎么可能**

让我们假设,您的项目导入了一个包dog-2.0.jaranimal-2.0.jar,现在,您可能不知道dog-2.0.jar内部导入了animal-1.0.jar,因此,由于这种导入依赖性,JVM将导入一个名为Animal. class的类,该类将来自animal-1.0.jar,而不是您/您的项目预期来自animal-2.0.jarAnimal. class
"然后呢"
JVM甚至在Animal-2.0.jar的预期导入之前就获得了Animal. class的引用。因此,jar文件的导入顺序(类路径)会无意中扰乱这种传递依赖关系。
"我能做什么"
您可以在IntelliJ中右键单击您的项目,Eclipse中也可以执行类似的操作。

Open Module Settings -> Click on Dependencies

你会在这里得到一个要导入的jar列表。你可以重新排列这些jar的顺序。你可以把dog-2.0.jar推到你的animal-2.0.jar依赖项的正下方。这将解决这个问题。

yks3o0rb

yks3o0rb4#

我通过将pom.xml中guava依赖项的版本更改为23.0解决了这个问题。
如果仍然不起作用,请尝试将pom.xml中gson依赖项的版本更改为2.8.22.8.5

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.2</version>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

相关问题