package ch.vorburger.webdriver.runner.core.providers;
import org.openqa.selenium.WebDriver;
import ch.vorburger.webdriver.runner.core.WebDriverProvider;
/**
* WebDriverProvider which "recycles" one once constructed WebDriver,
* instead of actually creating a new one on each call to getNewWebDriver()
* e.g. for each test.
*
* This can be useful for speed when executing a suite of tests, because
* starting and opening up a new browser for each test is time consuming.
*
* If you close() or quit() the returned WebDriver, the implementation will ensure that
* it doesn't actually close the last window or really quit (so that it can be re-used).
* <i>(From experience in a large in-house / proprietary test base with an older WebDriver
* version, I vaguely recall that this didn't always work reliably, because getWindowHandles()
* under some circumstance didn't work as expected... hopefully that's better now; else you may
* not want to use this, in case your tests open new windows [not just DIV layers].)</i>
*
* This class is, intentionally and by design, NOT multi-thread safe.
* It is intended to be used in single threaded one-after-the-other
* (for a given WebDriver implementation) runners.
* @see PoolingDriverProvider
*/
public class RecyclingDriverProvider extends DelegatingDriverProvider {
protected WebDriver webDriver;
public RecyclingDriverProvider(WebDriverProvider delegate) {
super(delegate);
}
@Override public WebDriver getNewWebDriver() throws Exception {
if (webDriver == null)
webDriver = wrapNeverClosingOrQuitting(super.getNewWebDriver());
return webDriver;
}
protected WebDriver wrapNeverClosingOrQuitting(WebDriver newWebDriver) {
return new NeverClosingQuittingWebDriver(newWebDriver);
}
}