package com.crawljax.browser;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.rules.ExternalResource;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.crawljax.browser.EmbeddedBrowser.BrowserType;
import com.google.common.base.Strings;
public class BrowserProvider extends ExternalResource {
private static final Logger LOG = LoggerFactory
.getLogger(BrowserProvider.class);
private List<RemoteWebDriver> usedBrowsers;
public static EmbeddedBrowser.BrowserType getBrowserType() {
String browser = System.getProperty("test.browser");
if (!Strings.isNullOrEmpty(browser)) {
return EmbeddedBrowser.BrowserType.valueOf(browser);
} else {
return EmbeddedBrowser.BrowserType.FIREFOX;
}
}
@Override
protected void before() throws Throwable {
usedBrowsers = new LinkedList<>();
}
public EmbeddedBrowser newEmbeddedBrowser() {
return WebDriverBackedEmbeddedBrowser.withDriver(newBrowser());
}
/**
* First try to create phantomJS. If that fails, try Chrome.
*/
public RemoteWebDriver newBrowser() {
RemoteWebDriver driver;
switch (getBrowserType()) {
case FIREFOX:
driver = new FirefoxDriver();
break;
case INTERNET_EXPLORER:
driver = new InternetExplorerDriver();
break;
case CHROME:
driver = new ChromeDriver();
break;
case PHANTOMJS:
driver = new PhantomJSDriver();
break;
default:
throw new IllegalStateException("Unsupported browsertype "
+ getBrowserType());
}
/* Store the browser as a used browser so we can clean it up later. */
usedBrowsers.add(driver);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS)
.pageLoadTimeout(30, TimeUnit.SECONDS)
.setScriptTimeout(30, TimeUnit.SECONDS);
driver.manage().deleteAllCookies();
return driver;
}
@Override
protected void after() {
for (RemoteWebDriver browser : usedBrowsers) {
try {
/* Make sure we clean up properly. */
if (!browser.toString().contains("(null)")) {
if (getBrowserType() == BrowserType.PHANTOMJS) {
// PhantomJS only quits the process on quit command
browser.quit();
} else {
browser.close();
}
}
} catch (RuntimeException e) {
LOG.warn("Could not close the browser: {}", e.getMessage());
}
}
}
}