【问题标题】:Exception when running ChromeDriver with WebDriverManager in maven project在 Maven 项目中使用 WebDriverManager 运行 ChromeDriver 时出现异常
【发布时间】:2017-09-14 15:01:18
【问题描述】:

尝试在 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();
        }
    }
}

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

【问题讨论】:

    标签: maven selenium-chromedriver gauge webdrivermanager-java getgauge


    【解决方案1】:

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

    【讨论】:

    • 如果有帮助的话,Guava 的当前版本是 guava-21.0.jar。
    • 有没有我会同时做的解决方法?提前致谢。
    【解决方案2】:

    是的,添加番石榴依赖后为我工作:

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

    【讨论】:

      【解决方案3】:

      1st Possible Solution

      第二种可能的解决方案

      仅当问题未通过第一个解决方案解决时才参考此答案。

      我遇到了这个问题,但在 SO 上没有找到可接受的答案。我已经通过在非 SO 链接上阅读它并将其粘贴到此处以供将来参考来弄清楚这一点。

      我们需要先弄清楚确切的问题。

      如果您使用的是 IntelliJ 或 Eclipse,则需要转到 Run/Debug Configurations,并添加 VM 参数,

      -ea -verbose:class
      

      现在,重新运行您的测试。 这将开始打印出这些类被导入和使用的类和 jar。在您的具体情况下,如果您搜索 SimpleTimeLimiter,您将看到从中导入它的包。

      由于软件包版本冲突,出现此错误。 一个 jar 依赖项将引用早期的 guava 版本,并且此 jar 将出现在类路径的早期。这将避免使用预期的类路径。 更准确地说,会有一些包比您在 pom.xml 中编写的包更早地导入 guava

      怎么可能?

      让我们假设,您的项目导入了 dog-2.0.jaranimal-2.0.jar 包。现在,您可能不知道 dog-2.0.jar 在内部导入 animal-1.0.jar。因此,由于导入的这种依赖性,JVM 将导入一个名为 Animal.class 的类,该类来自 animal-1.0.jar 而不是 Animal。类你/你的项目期待来自animal-2.0.jar

      然后呢?

      JVM 会在 Animal.class 的引用到达您对 animal-2.0.jar 的预期导入之前。因此,导入 jar 文件的顺序(类路径)会无意中与这种传递依赖关系混淆。

      我能做什么?

      您可以在 INtelliJ 中右键单击您的项目,在 Eclipse 中也可以使用类似的东西。点击

      Open Module Settings -> Click on Dependencies
      

      您将在此处获得要导入的 jar 列表。您可以重新排列罐子的顺序。您可以将 dog-2.0.jar 推送到您的 animal-2.0.jar 依赖项下方。这将解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-02
        • 1970-01-01
        • 2015-06-03
        • 2017-09-19
        • 2012-07-12
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多