Java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState(ZLjava/lang/String;)在使用Selenium、Gradle和ChromeDriver时的解决方法

5

我想使用Gradle和Selenium api。 这是我的build.gradle依赖项部分:

dependencies {
    compile 'com.google.api-client:google-api-client:1.23.0'
    compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0'
    compile 'com.google.apis:google-api-services-sheets:v4-rev506-1.23.0'
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version:        '2.9.0'
    compile group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver', version: '2.9.0' }

我的Selenium - Java代码:

System.setProperty("webdriver.chrome.driver", "C:\\Program Files(x86)\\Google\\Chrome\\Application\\chrome.exe");
WebDriver driver = new ChromeDriver();

代码运行良好,我可以打开Chrome浏览器。 然而,在 build.gradle 中,我正在使用 Selenium 和Chromedriver的2.9.0版本。如果我尝试使用2.9.0之后的任何版本,它会在 WebDriver driver = new ChromeDriver(); 方法中给出以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
        at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:124)
        at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDriverService.java:32)
        at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExecutable(ChromeDriverService.java:137)
        at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:339)
        at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:88)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:123)
        at Quickstart.main(Quickstart.java:130)

我尝试查找支持gradle+Maven+selenium的版本,但没有找到有用的信息。你有什么想法吗?

9个回答

4

This error message...

Exception in thread "main" java.lang.NoSuchMethodError:
com.google.common.base.Preconditions.checkState(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V

这句话的意思是Java客户端无法找到ChromeDriver()

问题和解决方案

根据您分享的Selenium - Java代码System.setProperty()行用于设置ChromeDriver二进制路径,而不是Chrome二进制路径。因此,您必须从ChromeDriver - WebDriver for Chrome下载ChromeDriver二进制文件并将其放置在您的系统中,并通过System.setProperty()行指定ChromeDriver的绝对路径。因此,您需要更改:

System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
WebDriver driver = new ChromeDriver();

收件人:

System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
WebDriver driver = new ChromeDriver();

谢谢您的回复!我尝试下载chromedriver.exe并将其用于代替chrome.exe,但问题仍然存在。问题是为什么在build.gradle具有selenium依赖项<= 2.9.0时,无论使用chrome.exe还是chromedriver.exe,一切都正常工作。而对于selenium依赖项> 2.9.0,则无法打开浏览器。 - Swati Thorve
根据当前版本的_Selenium Client v3.9.1_,selenium dependencies > 2.9.0已经非常古老了。自_Selenium v2.9.0_以来,很多东西都发生了变化。因此,根据最佳实践,您需要升级_Selenium Client_,_ChromeDriver_和_Chrome_到当前版本以获得更好的脚本性能。 - undetected Selenium
谢谢Debanjan!是的,我知道2.9.0已经相当陈旧了……我也不想用它。这就是为什么要问这个问题:)为什么我在尝试使用selenium 2.9+时会得到我原始帖子中描述的错误?我有最新的Chrome V67和chromedriver。还有其他任何需要检查的吗? - Swati Thorve
选择所有最新版本的_JDK v8u162_,_Selenium v3.9.1_,_ChromeDriver v2.35_和_Chrome v64.x_。这样你就可以顺利完成了。 - undetected Selenium

4

尝试将 Guava 更新至

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.1-jre</version>
</dependency>

它会解决你的问题。

1
我有完全相同的问题(但我正在使用Maven)。
我注意到问题在于同时使用com.google.api-clientcom.google.oauth-clientcom.google.apis:google-api-services-sheetsorg.seleniumhq.selenium会导致错误。
问题在于两个依赖项都依赖于不同的com.google.guava:guava构件。
为了解决此错误,您应该明确依赖于单个com.google.guava:guava构件。 因此,请在您的build.gradle中添加以下内容: compile 'com.google.guava:guava:27.0.1-jre'

0

我曾经遇到过同样的问题,进行了依赖检查后发现存在冲突。对我有效的解决方案是排除这些冲突的依赖项。

你的项目可能与我的有不同的依赖关系。因此,列出我项目中的具体冲突可能并不有用。


0

问题可能也在于包含了Google Collections:

// https://mvnrepository.com/artifact/com.google.collections/google-collections
implementation 'com.google.collections:google-collections:1.0'

我曾经将这个库包含在我的项目中,但是它让我抓狂了,因为我找不到原因。

将参数-verbose:class加入JVM可以帮助我们找到罪魁祸首。


0

对我来说,添加guava依赖项和chromedriver版本依赖项是可行的 -

<dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>25.0-jre</version>
</dependency>
<dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>3.141.59</version>
        <scope>test</scope>
</dependency>

0

复制并粘贴以下依赖项到pom.xml文件中,然后执行Maven构建:

 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

      <!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.1.0</version>
    <scope>test</scope>
</dependency>

    <!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <version>3.0.0</version>
    <scope>test</scope>
</dependency>

    <!-- https://mvnrepository.com/artifact/io.rest-assured/json-path -->
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>json-path</artifactId>
    <version>3.0.0</version>
</dependency>

    <!-- https://mvnrepository.com/artifact/io.rest-assured/json-schema-validator -->
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>3.0.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/io.rest-assured/xml-path -->
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>xml-path</artifactId>
    <version>3.0.0</version>
</dependency>

    <!-- https://mvnrepository.com/artifact/org.hamcrest/java-hamcrest -->
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>java-hamcrest</artifactId>
    <version>2.0.0.0</version>
    <scope>test</scope>
</dependency>


    <!-- cucumber dependency begins -->


    <!-- https://mvnrepository.com/artifact/net.masterthought/cucumber-reporting -->
    <dependency>
    <groupId>net.masterthought</groupId>
    <artifactId>cucumber-reporting</artifactId>
    <version>4.7.0</version>
    </dependency>

    <!-- starts here -->
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-core</artifactId>
        <version>1.2.5</version>
    </dependency>

    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>1.2.5</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-jvm</artifactId>
        <version>1.2.5</version>
        <type>pom</type>
    </dependency>

    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>1.2.5</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-jvm-deps</artifactId>
        <version>1.0.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/info.cukes/cucumber-html -->
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-html</artifactId>
    <version>0.2.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/info.cukes/gherkin -->
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>gherkin</artifactId>
    <version>2.12.2</version>
    <scope>provided</scope>
</dependency>


<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-testng -->
<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-testng</artifactId>
    <version>5.4.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.theoryinpractise/cucumber-testng-factory -->
<dependency>
    <groupId>com.theoryinpractise</groupId>
    <artifactId>cucumber-testng-factory</artifactId>
    <version>1.0.1</version>
</dependency>
<!--   https://dev59.com/cqnka4cB1Zd3GeqPNmhT?rq=1  -->
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.1-jre</version>
</dependency>

  </dependencies>

1
能够提供更多关于你的解决方案为什么有效以及它是如何工作的信息会很好。 - ich5003

0

我只是想在这里发帖,以防像我一样的其他人从谷歌进入。出于某种原因,我需要使用sudo运行。我在使用npm selenium-standalone包时遇到了问题,无法运行:

/node_modules/selenium-standalone/bin/selenium-standalone start

这会显示错误。解决方法是使用sudo运行。

sudo /node_modules/selenium-standalone/bin/selenium-standalone start

我之前不认为需要这样做,但突然间这是唯一的可行方式。


0

仅仅添加下面的内容是不够的

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

一开始它不起作用。后来我把这个依赖项在pom.xml中的位置提升到了junit依赖项之上,然后它就起作用了。所以,请确保在pom文件中它要比junit或testng或你正在使用的任何测试运行器更靠前。

这篇文章中的一条评论给了帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接