Java Selenium:错误:无法访问 MutableCapabilities

Posted

技术标签:

【中文标题】Java Selenium:错误:无法访问 MutableCapabilities【英文标题】:Java Selenium: error: cannot access MutableCapabilities 【发布时间】:2018-03-09 09:01:16 【问题描述】:

尝试将我们的代码更新到 Selenium 3.x,但在尝试运行我们的测试时不断遇到错误:

error: cannot access MutableCapabilities

就运行测试而言,同样的代码过去一直有效,但我不确定它在哪里或为什么会出现如此奇怪的错误。我似乎找不到任何人以前写过的东西,所以我希望 *** 社区可以帮助我。

这是产生此错误的代码:

package com.iacapps.ste.ta.helpers;

import com.google.common.base.Strings;
import com.paypal.selion.platform.grid.browsercapabilities.DefaultCapabilitiesBuilder;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;

public class CustomCapabilities extends DefaultCapabilitiesBuilder

  private static final Logger logger = LoggerFactory.getLogger(DefaultCapabilitiesBuilder.class);

  private static final String SAUCE_TUNNEL_PROPERTY = "sauceTunnel";
  private static final String SAUCE_ENABLED_PROPERTY = "enableSauceConnect";
  private static final String TUNNEL_CAPABILITY = "tunnelIdentifier";
  private static final String ACCEPT_ALL_SSL_CAPABILITY = "acceptSslCerts";
  private static final String CHROME_SWITCHES = "chrome.switches";
  private static final String CHROME_IGNORE_SSL = "--ignore-certificate-errors";
  private static final String FIREFOX_ACCEPT_BAD_CERTS_CAPABILITY = "acceptInsecureCerts";

  @Override
  public DesiredCapabilities getCapabilities(DesiredCapabilities capabilities)
  
    String sauceEnabledValue = System.getProperty(SAUCE_ENABLED_PROPERTY);
    String tunnelIdValue = System.getProperty(SAUCE_TUNNEL_PROPERTY);
    //This will just prevent the warning being printed when sauceconnect isn't enabled.
    if (!Strings.isNullOrEmpty(sauceEnabledValue) && Boolean.valueOf(sauceEnabledValue))
    
      if (Strings.isNullOrEmpty(tunnelIdValue))
      
        logger.warn(" not set", SAUCE_TUNNEL_PROPERTY);
      
      else
      
        capabilities.setCapability(TUNNEL_CAPABILITY, tunnelIdValue);
      
    
    //There's a reason for this charlie foxtrot.  I don't always get to know what browser driver I'm
    //talking to.
    //Per selenium docs: "Whether the session should accept all SSL certs by default."
    //The DOWNSIDE: this seems to work with newer browser drivers, but it may not work with old ones.
    capabilities.setCapability(ACCEPT_ALL_SSL_CAPABILITY, true);
    //This *supposedly* works with some versions of IE.
    capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
    //This *supposedly* works with some chrome versions.

    capabilities.setCapability(CHROME_SWITCHES, Collections.singletonList(CHROME_IGNORE_SSL));
    //Oh my god please work you STUPID FIREFOX
    //http://***.com/a/40788935
    //https://bugzilla.mozilla.org/show_bug.cgi?id=1103196
    //Should work with firefox > v51
    capabilities.setCapability(FIREFOX_ACCEPT_BAD_CERTS_CAPABILITY,true);
    //When in doubt SET EVERYTHING!
    FirefoxProfile profile = new FirefoxProfile();
    profile.setAcceptUntrustedCertificates(true);
    profile.setAssumeUntrustedCertificateIssuer(false);
    capabilities.setCapability(FirefoxDriver.PROFILE,profile);
    capabilities.setCapability(FirefoxDriver.MARIONETTE,false);
    return capabilities;
  

【问题讨论】:

这个类的目的到底是什么?你如何使用它?您真的需要扩展DefaultCapabilitiesBuilder 来创建一组自定义功能吗? 我需要将浏览器 mob 代理代理信息附加到测试中。以及如果我使用saucelabs进行测试,我需要输入sauce connect代理信息。 没关系。但我看不出有任何理由在这里使用DefaultCapabilitiesBuilder。您可以使用一个常见的 java 方法执行相同的操作,该方法返回 DesiredCapabilities。这就是为什么我要你展示一个代码,在哪里使用这个类。 @SergeyKorol - 此构建器通过 JVM 参数或服务加载器注入。 见here(或)1 > 2 > 3 【参考方案1】:

好吧,原来我的问题是因为 maven 中的一些依赖项让我全都缠绕在轴上。我发帖希望如果其他人遇到这个问题,他们可以查看这里并弄清楚发生了什么。

所以对我来说,以下工件不在正确、匹配的 selenium 版本上:

selenium-support selenium-java selenium-api

一旦我将这些更正为我正在运行的相同版本的 selenium (3.5.3),我就能够成功打开 Firefox,而没有出现我之前遇到的异常。

【讨论】:

【参考方案2】:

我一直有这个问题, 我的解决方案是添加/更新 pom.xml

 <!-- SELENIUM DEPENDENCIES ( WORKING VERSION )-->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.53.1</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-support</artifactId>
        <version>2.53.1</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-firefox-driver</artifactId>
        <version>2.53.1</version>
    </dependency>

【讨论】:

这很有帮助。在仅更改一个依赖项的版本号后,我收到了类似的消息。

以上是关于Java Selenium:错误:无法访问 MutableCapabilities的主要内容,如果未能解决你的问题,请参考以下文章

出现错误:无法访问 org.openqa.selenium.virtualauthenticator.HasVirtualAuthenticator

运行selenium测试时出现“无法启动Selenium会话:内部服务器错误”错误

Java Selenium InvalidElementStateException 错误

无法使用Selenium和Java 11导入org.openqa.selenium.WebDriver

Selenium-Webdriver (Java) 无法始终执行“悬停和单击”功能

Selenium / Java:无法在离子搜索弹出窗口中找到元素