package org.jboss.arquillian.drone.webdriver.factory;
import java.text.MessageFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.drone.spi.Configurator;
import org.jboss.arquillian.drone.spi.DronePoint;
import org.jboss.arquillian.drone.webdriver.configuration.WebDriverConfiguration;
import org.jboss.arquillian.drone.webdriver.spi.BrowserCapabilities;
import org.jboss.arquillian.drone.webdriver.spi.BrowserCapabilitiesRegistry;
import org.jboss.arquillian.drone.webdriver.utils.Validate;
import org.openqa.selenium.WebDriver;
abstract class AbstractWebDriverFactory<T extends WebDriver> implements Configurator<T, WebDriverConfiguration> {
private static final Logger log = Logger.getLogger(AbstractWebDriverFactory.class.getName());
@Inject
protected Instance<BrowserCapabilitiesRegistry> registryInstance;
protected abstract String getDriverReadableName();
@Override
public WebDriverConfiguration createConfiguration(ArquillianDescriptor descriptor, DronePoint<T>
dronePoint) {
BrowserCapabilitiesRegistry registry = registryInstance.get();
// first, try to create a BrowserCapabilities object based on Field/Parameter type of @Drone annotated field
BrowserCapabilities browser = registry.getEntryFor(getDriverReadableName());
WebDriverConfiguration configuration = new WebDriverConfiguration(browser).configure(descriptor,
dronePoint.getQualifier());
// if not set, we hit a webdriver configuration and we want to use browser capabilities
if (browser == null && Validate.nonEmpty(configuration.getBrowser())) {
browser = registry.getEntryFor(configuration.getBrowser().toLowerCase());
if (browser == null) {
throw new IllegalStateException(
MessageFormat
.format("Unable to initialize WebDriver instance. Please specify a valid browser " +
"instead of {1}. Available options are: {0}",
getAvailableBrowserCapabilities(), configuration.getBrowser()));
}
configuration.setBrowserInternal(browser);
}
// if it is still null, go with defaults
if (browser == null) {
browser = registry.getEntryFor(WebDriverConfiguration.DEFAULT_BROWSER_CAPABILITIES);
log.log(Level.INFO, "Property \"browser\" was not specified, using default value of {0}",
WebDriverConfiguration.DEFAULT_BROWSER_CAPABILITIES);
configuration.setBrowserInternal(browser);
}
return configuration;
}
private String getAvailableBrowserCapabilities() {
BrowserCapabilitiesRegistry registry = registryInstance.get();
StringBuilder sb = new StringBuilder();
for (BrowserCapabilities browser : registry.getAllBrowserCapabilities()) {
if (Validate.nonEmpty(browser.getReadableName())) {
sb.append(browser.getReadableName()).append(", ");
}
}
// trim
if (sb.lastIndexOf(", ") != -1) {
sb.delete(sb.length() - 2, sb.length());
}
return sb.toString();
}
}