尝试在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();
}
}
}
如果您需要了解更多信息,请通知我以找到解决方案。
答案 0 :(得分:4)
您在Guava中存在版本冲突。 Selenium WebDriver(不是WebDriverManager)依赖于给定版本的Guava传递,并且您似乎在项目中使用另一个版本。我会使用两者的最新版本。
答案 1 :(得分:0)
是的,添加番石榴依赖项后为我工作:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>
答案 2 :(得分:0)
第二种可能的解决方案
仅当第一解决方案未解决问题时,才引用此答案。
我已经遇到了这个问题,因此在SO上没有找到可接受的答案。我已经通过在非SO链接上阅读并将其粘贴在此处以供将来参考来弄清楚。
我们需要先找出确切的问题。
如果使用的是IntelliJ或Eclipse,则需要转到“运行/调试配置”,并添加VM参数,
-ea -verbose:class
现在,重新运行测试。 这将开始打印出类和从中导入和使用这些类的jar。在特定情况下,如果您搜索 SimpleTimeLimiter ,您将看到从中导入的包。
由于软件包版本存在冲突,因此出现了此错误。 一个jar依赖项将引用早期的 guava 版本,并且此jar将出现在类路径的早期。这样可以避免使用预期的类路径。 更准确地说,将有一些软件包早于您在pom.xml中编写的软件包导入 guava 。
那怎么可能?
让我们假设,您的项目是导入包 dog-2.0.jar 和 animal-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-2.0.jar 之前获得 Animal.class 的引用。因此,jar文件的导入顺序(类路径)将无意间与这种传递依赖关系发生冲突。
我该怎么办?
您可以在INtelliJ中右键单击您的项目,对于Eclipse则类似。点击
Open Module Settings -> Click on Dependencies
您将在此处获取要导入的jar的列表。您可以重新排列罐子的顺序。您可以将 dog-2.0.jar 推到 animal-2.0.jar 依赖项的正下方。这样可以解决问题。