4

所以,我正在使用 Selenium 和 gradle 在 Java 上构建一个测试项目。现在我需要从之前截取的屏幕截图中扫描二维码。我环顾四周,发现 ZXing 扫描仪代码似乎是最好的建议。(如果不是,请告诉我。)我的问题是,从我将 'com.google.zxing:zxingorg:3.3.1' 依赖项添加到我的 build.gradle 文件的那一刻起,即使我不写任何附加代码(我尝试过有无),网络驱动程序停止工作,我收到以下消息:

java.lang.IllegalAccessError: tried to access method com.google.common.util.concurrent.SimpleTimeLimiter.<init>(Ljava/util/concurrent/ExecutorService;)V from class org.openqa.selenium.net.UrlChecker

at org.openqa.selenium.net.UrlChecker.<init>(UrlChecker.java:67)
at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:175)
at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:166)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:78)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601)
at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:241)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:128)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:141)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:174)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:163)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:152)
at Specification.ClientFactory.initContext(ClientFactory.groovy:81)
at Specification.ClientFactory.<init>(ClientFactory.groovy:61)
at Specification.BaseTest.setupSpec(BaseTest.groovy:14)


Test ignored.

出现此错误的代码是我用来启动 Selenium WebDriver 的代码:

ClientFactory(){
    initUrl()   //allows to change the URL of the application under test when needed
    initContext(urlWebsite,initWebBrowser())    //switchcase to read the browser from a config file
    initClient()    //initialization of the different classes with the elements I'm accessing
}

错误中提到的第 61 行是指 Chrome WebDriver 的初始化:

webDriver = new ChromeDriver(options)

(我尝试禁用这些选项,我得到的错误是完全相同的,所以我认为问题不是来自那里。)

我已经看了很长时间,但没有发现任何关于这个错误的信息。我不知道的 Selenium 和 ZXing 依赖项之间是否存在冲突?如果是这样,有没有办法超越它?如何?

更新:对于碰巧遇到类似问题的人,如果您退回到早期版本的 selenium-java 和 ZXing,则不会发生此问题。我设法克服了我的 build.gradle 文件中的 'org.seleniumhq.selenium:selenium-java:3.0.1' 和 'com.google.zxing:zxingorg:3.2.1' 的问题,它们不是最新的,但它是这样工作的

4

2 回答 2

2

对于任何阅读本文的人。我在依赖项方面面临同样的问题:

我非常依赖 com.google.guava:guava:23.3 或更高版本

+--- com.github.ben-manes.caffeine:guava:2.6.0
|    +--- com.github.ben-manes.caffeine:caffeine:2.6.0
|    \--- com.google.guava:guava:23.3-jre (*)

并且正在使用 org.seleniumhq.selenium:selenium-java:3.0.1 与 guava 版本 > 22.0 不兼容,如下所述:

https://github.com/SeleniumHQ/selenium/issues/4381

解决方案:将 selenium 升级到最新解决了该问题,如此处所述

于 2018-05-11T08:29:28.163 回答
1

错误说明了一切:

java.lang.IllegalAccessError: tried to access method com.google.common.util.concurrent.SimpleTimeLimiter.<init>(Ljava/util/concurrent/ExecutorService;)V from class org.openqa.selenium.net.UrlChecker

主要的例外来自class org.openqa.selenium.net.UrlChecker. 如果您查看UrlChecker的 JavaDocs,即org.openqa.selenium.net.UrlChecker扩展java.lang.Object,它会轮询 URL,直到收到 HTTP 200 响应。

嵌套类是UrlChecker.TimeoutException,它扩展了java.lang.Exception

因此,一旦构造函数TimeoutException(java.lang.String s, java.lang.Throwable throwable) failed java.lang.IllegalAccessError被引发,这意味着应用程序试图调用它无权访问的方法

通常这个错误会被Java 编译器捕获,并且这个错误只有在类的定义发生变化时才会在运行时发生。

一个直接的解决方案是检查对 的调用url并确保get("your_url")通过void org.openqa.selenium.WebDriver.get(String arg0).

还要确保子网防火墙设置没有阻止http 请求

于 2018-01-30T12:11:00.540 回答