Trying to update our code to Selenium 3.x, and I keep running into an error being thrown when I'm trying to run our tests:
error: cannot access MutableCapabilities
This same code used to work as far as running the tests, and I'm not really sure where or why it's coming up with such a strange error. I can't seem to find anything that anyone has written up before, so I'm hoping that the stackoverflow community can help me with this one.
Here's the code that is generating this error:
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://stackoverflow.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;
}
}