java.lang.NoSuchMethodError: 'com.google.common.collect.ImmutableMap 尝试使用 Chromedriver 和 Maven 执行测试时出错

Tun*_*una 16 java selenium nosuchmethoderror maven selenium-webdriver

我是硒测试的新手,目前正在使用 Maven 观看一些 YouTube 视频。

今天我尝试了一些代码并且工作正常,但是当访问一个商店页面并尝试搜索产品时,它给我“访问被拒绝”消息所以我尝试了几种打开 chrome 而不是 chromedriver 的方法。

但我放弃了,愿意尝试另一个网页。但现在 chromedriver 无法打开(给出错误消息)。operadriver、geckodriver等将在启动后立即关闭。

我收到此错误:

java.lang.NoSuchMethodError: 'com.google.common.collect.ImmutableMap com.google.common.collect.ImmutableMap.of(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'
Run Code Online (Sandbox Code Playgroud)

我尝试在很多地方查找,但大多数人说它是番石榴版本,我不使用番石榴,即使我尝试将其添加到依赖项中......

我的代码是这样的:

public class TestYoutubeClass {
    WebDriver driver;
    @Before
    public void runDriver(){
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.kabum.com.br");
Run Code Online (Sandbox Code Playgroud)

我尝试从头开始,但没有任何效果。我正在使用 IntelliJ,pom.xml我添加了:junit; selenium-javawebdrivermanager

非常感谢每一个帮助。

rie*_*pil 17

该问题来自冲突的 Guava(传递依赖)版本。

它应该用WebDriverManager 版本 5.1.0修复。

作为替代方案,您还可以使用<dependencyManagement>您的部分pom.xml强制解决最新的 Guava 版本:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>31.0.1-jre</version>
    </dependency>
  </dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

或者从 WebDriverManager 中排除 Guava 依赖项(>= 5.1.0 不再需要):

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.0.3</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)

PS:为了确保 Maven 项目的依赖项收敛,请考虑添加 Maven Enforcer 插件以尽早检测传递依赖项的多个版本。


小智 14

我正在使用 maven 并将版本 4.1.2 降级到 4.1.1 解决了我的问题

<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


小智 9

添加以下依赖项后我也遇到了上述问题,它工作得很好。我使用的是Chrome 98版本

<dependencies>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>31.0.1-jre</version>
    </dependency>
  </dependencies>
Run Code Online (Sandbox Code Playgroud)


Deb*_*anB 1

这个错误信息...

java.lang.NoSuchMethodError: 'com.google.common.collect.ImmutableMap com.google.common.collect.ImmutableMap.of(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'
Run Code Online (Sandbox Code Playgroud)

...意味着存在NoSuchMethod ,这表明它可能已损坏,或者您专门使用的二进制文件版本与番石榴版本/依赖项com.google.common.collect.ImmutableMap(maven)之间存在一些不兼容。


您需要注意以下几件事:

  • 您需要添加System.setProperty()

    System.setProperty("webdriver.gecko.driver","C:\\Program Files\\Java\\jre1.8.0_231\\lib\\ext\\geckodriver.exe");
    
    Run Code Online (Sandbox Code Playgroud)
  • 仅使用 WebDriver 的单个实例,无论是来自范围还是来自方法范围。

  • 实际上,您的代码行将是;

    public class TestYoutubeClass {
        WebDriver driver;
        @Before
        public void runDriver(){
            System.setProperty("webdriver.chrome.driver","/path/to/chromedriver");
            driver = new ChromeDriver();
            driver.get("http://www.kabum.com.br");
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您使用,删除损坏/不兼容的.m2文件夹可以解决您的问题。