package de.asideas.crowdsource.testsupport.selenium;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.logging.Level;
/**
* Stateful! Holds WebDriver-Instance
*/
@Service
public class WebDriverProvider {
private final static Logger LOG = LoggerFactory.getLogger(WebDriverProvider.class);
public static final int DESKTOP_WIDTH = 1280;
public static final int MOBILE_WIDTH = 400;
private static boolean IS_RECYCLED = false;
private static RemoteWebDriver DRIVER_INSTANCE;
public static void setIsRecycled(boolean isRecycled) {
IS_RECYCLED = isRecycled;
}
@Value("${de.asideas.crowdsource.test.chrome.binary:unset}")
private String chromeBinaryPath;
public static void closeRecycledWebDriver() {
IS_RECYCLED = false;
closeWebDriver();
}
/**
* will close driver instance
*/
public static void closeWebDriver() {
if (IS_RECYCLED) {
return;
}
if (DRIVER_INSTANCE == null) {
return;
}
// get handle of driver
RemoteWebDriver driverHandle = DRIVER_INSTANCE;
// break class reference
DRIVER_INSTANCE = null;
// close old driver
try {
if (driverHandle instanceof FirefoxDriver) {
driverHandle.quit();
} else {
driverHandle.close();
}
} catch (Exception e) {
LOG.warn("exception closing webdriver: {}", e.getMessage());
}
}
/**
* @return {@link org.openqa.selenium.chrome.ChromeDriver} if binary specified, fallback to firefox
*/
public RemoteWebDriver provideDriver() {
if (DRIVER_INSTANCE == null) {
if (new File(chromeBinaryPath).exists()) {
LOG.info("providing chromedriver");
System.setProperty("webdriver.chrome.driver", chromeBinaryPath);
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
enableLogging(capabilities);
DRIVER_INSTANCE = new ChromeDriver(capabilities);
} else {
LOG.info("providing firefox driver as chromedriver-binary was not specified or does not resolve in file system.");
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
enableLogging(capabilities);
DRIVER_INSTANCE = new FirefoxDriver(capabilities);
}
}
DRIVER_INSTANCE.manage().window().setSize(new Dimension(DESKTOP_WIDTH, 800));
return DRIVER_INSTANCE;
}
public RemoteWebDriver provideMobileDriver() {
RemoteWebDriver driver = provideDriver();
driver.manage().window().setSize(new Dimension(WebDriverProvider.MOBILE_WIDTH, 800));
return driver;
}
private void enableLogging(DesiredCapabilities capabilities) {
LoggingPreferences loggingPreferences = new LoggingPreferences();
loggingPreferences.enable(LogType.BROWSER, Level.ALL);
capabilities.setCapability(CapabilityType.LOGGING_PREFS, loggingPreferences);
}
public boolean hasActiveWebDriver() {
return DRIVER_INSTANCE != null;
}
}