package org.jboss.arquillian.drone.webdriver.factory;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.arquillian.cube.docker.drone.SeleniumContainers;
import org.arquillian.cube.docker.impl.client.CubeDockerConfiguration;
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.Destructor;
import org.jboss.arquillian.drone.spi.Instantiator;
import org.jboss.arquillian.drone.webdriver.configuration.WebDriverConfiguration;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
/**
* Custom Remote WebDriver Factory that generates a RemoteWebDriver pointing to Docker Selenium Docker IP.
*/
public class DockerRemoteWebDriverFactory extends AbstractWebDriverFactory<RemoteWebDriver> implements
Configurator<RemoteWebDriver, WebDriverConfiguration>, Instantiator<RemoteWebDriver, WebDriverConfiguration>,
Destructor<RemoteWebDriver> {
private static final Logger log = Logger.getLogger(DockerRemoteWebDriverFactory.class.getName());
@Inject
Instance<CubeDockerConfiguration> cubeDockerConfigurationInstance;
@Inject
Instance<SeleniumContainers> seleniumContainersInstance;
@Override
public void destroyInstance(RemoteWebDriver remoteWebDriver) {
try {
remoteWebDriver.quit();
} catch (WebDriverException e) {
log.log(Level.WARNING, "@Drone {0} has been already destroyed and can't be destroyed again.",
remoteWebDriver.getClass()
.getSimpleName());
}
}
@Override
public RemoteWebDriver createInstance(WebDriverConfiguration webDriverConfiguration) {
RemoteWebDriver remoteWebDriver = new RemoteWebDriver(createSeleniumUrl(), getDesiredCapabilities());
return remoteWebDriver;
}
private DesiredCapabilities getDesiredCapabilities() {
final SeleniumContainers seleniumContainers = seleniumContainersInstance.get();
switch (seleniumContainers.getBrowser()) {
case "firefox":
return DesiredCapabilities.firefox();
case "chrome":
return DesiredCapabilities.chrome();
// Never should happen since it is protected inside selenium containers class
default:
return DesiredCapabilities.firefox();
}
}
private URL createSeleniumUrl() {
try {
final CubeDockerConfiguration cubeDockerConfiguration = cubeDockerConfigurationInstance.get();
final SeleniumContainers seleniumContainers = seleniumContainersInstance.get();
final String dockerServerIp = cubeDockerConfiguration.getDockerServerIp();
return new URL("http", dockerServerIp, seleniumContainers.getSeleniumBoundedPort(), "/wd/hub");
} catch (MalformedURLException e) {
throw new IllegalArgumentException(e);
}
}
@Override
protected String getDriverReadableName() {
return "Docker Remote Web Driver";
}
@Override
public int getPrecedence() {
return Integer.MAX_VALUE;
}
}