【问题标题】:java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Capabilities) when trying to merge DesiredCapabilities using Seleniumjava.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Capabilities) 尝试使用 Selenium 合并 DesiredCapabilities
【发布时间】:2020-05-21 00:57:22
【问题描述】:

当我尝试使用DesiredCapabilitiesFirfoxOptions 启动新的Selenium/Firefox 实例时,我得到以下代码:

Exception in thread "main" java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Lorg/openqa/selenium/Capabilities;)Lorg/openqa/selenium/firefox/FirefoxOptions;

我正在使用以下代码:

public WebDriver getDriver() throws MalformedObjectNameException, InstanceNotFoundException, ReflectionException, InterruptedException
{

    System.setProperty("webdriver.gecko.driver", GlobalVar.geckdriverExecutableFilePath);

    //DesiredCapabilities capabilities = new DesiredCapabilities();



    DesiredCapabilities dc = DesiredCapabilities.firefox();


    if (proxyPOJO != null) {


        Proxy proxy = new Proxy();
        proxy.setHttpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
        proxy.setFtpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
        proxy.setSslProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());


        dc.setCapability(CapabilityType.PROXY, proxy);
    }

    FirefoxOptions opt = new FirefoxOptions();
    opt.merge(dc);


    opt.addPreference("dom.popup_maximum", 200);
    opt.addPreference("dom.webnotifications.enabled", false); 


    opt.merge(capabilities);


    WebDriver driver = WebDriverX.getNewFireFoxWebDriver(opt); // Basically calls: driver = new FirefoxDriver(firefoxOptions);  


    return driver;


}

我的POM 文件包含以下条目:

<dependencies>

     <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.11.0</version>
    </dependency>

</dependencyManagement>

<dependencies>

<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
</dependency>

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

以前,我在 POM 中有 org.seleniumhq.selenium 的 3.5.2 版本,它不支持 merge 功能。但是,当我尝试使用以下代码启动版本为 3.5.2 的 Selenium 时:

System.setProperty("webdriver.gecko.driver", GlobalVar.geckdriverExecutableFilePath);
DesiredCapabilities capabilities = new DesiredCapabilities();

    if (proxyPOJO != null) {

        Proxy proxy = new Proxy();
        proxy.setHttpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
        proxy.setFtpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
        proxy.setSslProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());


        capabilities.setCapability(CapabilityType.PROXY, proxy);
    }
FirefoxOptions firefoxOptions = new FirefoxOptions(capabilities);
WebDriver driver = WebDriverX.getNewFireFoxWebDriver(firefoxOptions); 

我遇到了以下异常:

NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.<init>(Lorg/openqa/selenium/Capabilities;)V

我安装了最新版本的geckodriver.exe

版本 3.11.0 或版本 3.5.2 都不起作用(我也尝试过 3.8.2)。

我做错了什么?

谢谢!

更新:

在 3.11.0 版本中,我得到以下堆栈跟踪:

Exception in thread "main" java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Lorg/openqa/selenium/Capabilities;)Lorg/openqa/selenium/firefox/FirefoxOptions;
    at webdriverX.WebDriverProfile.getTMPFirefoxProfile(WebDriverProfile.java:259)
    at s.SPage.scrapeS(SPage.java:36)
    at n.NMain.main(NMain.java:27)

对于 3.5.2 版本,以下是堆栈跟踪:

Exception in thread "main" java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.<init>(Lorg/openqa/selenium/Capabilities;)V
    at webdriverX.WebDriverProfile.getTMPFirefoxProfile(WebDriverProfile.java:232)
    at s.SPage.scrapeS(SPage.java:36)
    at n.NMain.main(NMain.java:27)

方法getTMPFirefoxProfile()基本上做了以下事情:

if (firefoxOptions != null) {
    driver = new FirefoxDriver(firefoxOptions);
} else {
                driver = new FirefoxDriver();
}

谢谢!!

【问题讨论】:

  • NoSuchMethodError表示不兼容的jar文件。添加完整的堆栈跟踪
  • 使用完整的错误堆栈跟踪更新问题
  • 所需功能主要用于远程 Web 驱动程序。你在硒网格上运行吗?
  • @Jens @DebanjanB @Murthi 我用stack trace 和其他详细信息更新了问题。请看一下。谢谢大家的帮助..
  • @Murthi 不,我不是,但我需要添加代理所需的功能:Proxy proxy = new Proxy(); proxy.setHttpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort()); proxy.setFtpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort()); proxy.setSslProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort()); capabilities.setCapability(CapabilityType.PROXY, proxy); 我需要FirefoxOptions 设置值,例如opt.addPreference("dom.popup_maximum", 200); opt.addPreference("dom.webnotifications.enabled", false);

标签: java selenium geckodriver desiredcapabilities mutablecapabilities


【解决方案1】:

此错误消息...

Exception in thread "main" java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Lorg/openqa/selenium/Capabilities;)Lorg/openqa/selenium/firefox/FirefoxOptions;

...暗示在您添加的类中没有这样的方法定义为merge()


合并()

merge()MutableCapabilities 中定义为:

public MutableCapabilities merge(Capabilities extraCapabilities)
    Merge the extra capabilities provided into this DesiredCapabilities instance. If capabilities with the same name exist in this instance, they will be overridden by the values from the extraCapabilities object.

Specified by:
    merge in interface Capabilities

Parameters:
    extraCapabilities - Additional capabilities to be added.

Returns:
    The DesiredCapabilities instance after the merge.

可变能力

Selenium v3.7.0 中添加了 MutableCapabilities:

v3.7.0
======
* Migrated from using `DesiredCapabilities` to either
  `MutableCapabilities` or (preferably) `ImmutableCapabilities`.

Maven 依赖

此外,您需要确保为 Selenium 添加了一个 &lt;dependency&gt;,如下所示:

<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-java</artifactId>
  <version>3.141.59</version>
</dependency>

注意selenium-java&lt;dependency&gt; 隐式还包括guava&lt;dependency&gt;


示例代码

System.setProperty("webdriver.gecko.driver", "gecko/linux/geckodriver");

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.proxy.no_proxies_on", "localhost");
profile.setPreference("javascript.enabled", true);

DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
capabilities.setCapability(FirefoxDriver.PROFILE, profile);

FirefoxOptions options = new FirefoxOptions();
options.merge(capabilities);
options.setLogLevel(Level.FINEST);
options.addPreference("browser.link.open_newwindow", 3);
options.addPreference("browser.link.open_newwindow.restriction", 0);

WebDriver driver = new FirefoxDriver(options);

其他建议

确保:

  • JDK 升级到当前级别JDK 8u232
  • Selenium 升级到当前级别 Version 3.141.59
  • GeckoDriver升级到GeckoDriver v0.26.0级别。
  • Firefox 版本升级到 Firefox v72.0 级别。
  • 如果您的基础 Web Client 版本太旧,请通过 Revo Uninstaller 卸载它并安装最新的 GA 和发布版本的 Web Client
  • 进行系统重启
  • 执行mvn cleanmvn buildmvn test
  • 以非 root 用户身份执行 Test

注意:如果是transitive dependency,您可能需要删除MAVEN_HOME,即~\.m2 子目录。


参考

您可以在以下位置找到一些相关的讨论:

【讨论】:

  • @AlanCook 删除maven_home 目录.m2 并重建。
  • 我跑了Maven clean 然后Maven build (我假设这就是你所指的)但同样的例外仍然存在..
  • @AlanCook 正是我的意思,但有时不兼容的依赖关系会造成混乱,正如我怀疑在 Guava 的情况下那样。因此我希望你删除MAVEN_HOME
  • 好的,我创建了一个全新的项目以确保没有未知的冲突依赖项.. 遵循您的建议,WebDriver 按预期启动.. 我有点迷路了.. 这样做意味着我当前项目所依赖的项目之一可能依赖于Selenium 的早期(不兼容)版本?我知道一个项目依赖于AShot 1.5.2,而后者又依赖于Selenium version 2.4.7 - 但是我在任何构建路径中都没有看到版本2.4.7 或有效的POM.. 我如何确认这是情况如何?
  • @AlanCook ...WebDriver 按预期启动... 很高兴能为您提供帮助。是的,SeleniumGuava 的多个版本之间似乎存在交叉依赖关系。可能某些/任何现有的二进制文件集已损坏。
猜你喜欢
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 2017-06-19
  • 2018-03-22
  • 2013-07-05
  • 1970-01-01
相关资源
最近更新 更多