/******************************************************************************* * Copyright 2014 JHC Systems Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package jhc.redsniff.webdriver.factory; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import org.openqa.selenium.Capabilities; import org.openqa.selenium.remote.DesiredCapabilities; public class WebDriverFactoryConfiguration implements Cloneable { private final URL url; private final String driverClassName; private final Capabilities capabilities; public WebDriverFactoryConfiguration(URL url, String driverClassName, Capabilities capabilities) { this.url = url; this.driverClassName = driverClassName; this.capabilities = capabilities; } public WebDriverFactoryConfiguration(String driverClassName, Capabilities capabilities) { this(null, driverClassName, capabilities); } public WebDriverFactoryConfiguration(URL url, Capabilities capabilities) { this(url, null, capabilities); } @Override public WebDriverFactoryConfiguration clone() { return new WebDriverFactoryConfiguration(url, new DesiredCapabilities(this.capabilities)); } public static WebDriverFactoryConfiguration forUrl(URL hubUrl, Capabilities capabilities) { return new WebDriverFactoryConfiguration(hubUrl, capabilities); } public static WebDriverFactoryConfiguration forDriver(String driverClass, Capabilities capabilities) { return new WebDriverFactoryConfiguration(driverClass, capabilities); } public static WebDriverFactoryConfiguration forCapabilities(Capabilities capabilities) { return new WebDriverFactoryConfiguration(null, null, capabilities); } public static WebDriverFactoryConfiguration forSystemProperties() { Map<String, String> capabilitiesMap = extractPrefixedCapabilitiesProperties( System.getProperties(), "selenium.capabilities."); String hub = System.getProperty("selenium.hub", ""); URL hubUrl; try { hubUrl = hub.isEmpty() ? null : new URL(hub); } catch (MalformedURLException e) { throw new AssertionError("invalid hub url: " + hub, e); } String defaultDriver = hubUrl != null ? "" : "HTMLUNIT-FIREFOX_17"; String driverName = System.getProperty("selenium.driver", defaultDriver); return hubUrl != null ? WebDriverFactoryConfiguration.forUrl(hubUrl, new DesiredCapabilities(capabilitiesMap)) : WebDriverFactoryConfiguration.forDriver( driverClassForDriver(driverName), capabilitiesMap.isEmpty() ? capabilitiesForDriver(driverName) : new DesiredCapabilities(capabilitiesMap)); } private static Map<String, String> extractPrefixedCapabilitiesProperties(Map<?, ?> properties, String prefix) { Map<String, String> map = new HashMap<String, String>(); for (Map.Entry<?, ?> entry: properties.entrySet()) { String key = String.valueOf(entry.getKey()); if (key.startsWith(prefix)) { map.put(key.substring(prefix.length()), String.valueOf(entry.getValue())); } } return map; } public Capabilities getCapabilities() { return capabilities; } @Override public String toString() { return "WebDriverFactoryConfiguration [url=" + url + ", capabilities=" + capabilities + "]"; } private static String driverClassForDriver(String driver) { return driver.contains(".") ? driver : ""; } private static Capabilities capabilitiesForDriver(String driverMode) { if (driverMode.equals("IE")) { return DesiredCapabilities.internetExplorer(); } else if (driverMode.equals("FIREFOX")) { return DesiredCapabilities.firefox(); } else if (driverMode.equals("CHROME")) { return DesiredCapabilities.chrome(); } else if (driverMode.equals("HTMLUNIT-FIREFOX_17")) { return DesiredCapabilities.htmlUnitWithJs(); } else if (driverMode.contains(".")) { return new DesiredCapabilities(); } else { throw new AssertionError("driverMode: " + driverMode + " not recognised"); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((capabilities == null) ? 0 : capabilities.hashCode()); result = prime * result + ((url == null) ? 0 : url.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; WebDriverFactoryConfiguration other = (WebDriverFactoryConfiguration) obj; if (capabilities == null) { if (other.capabilities != null) return false; } else if (!capabilities.equals(other.capabilities)) return false; if (url == null) { if (other.url != null) return false; } else if (!url.equals(other.url)) return false; return true; } public URL getUrl() { return url; } public String getDriverClassName() { return driverClassName; } }