Skip to content

Commit eb16bc1

Browse files
committed
feat(browserbuilder): add .autoQuitDriver()
closes #198
1 parent ba9db06 commit eb16bc1

9 files changed

Lines changed: 76 additions & 4 deletions

File tree

src/main/java/io/github/seleniumquery/browser/driver/DriverBuilder.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public abstract class DriverBuilder<T extends DriverBuilder<T>> {
4141

4242
private Consumer<BrowserManager> autoDriverDownloadConfigurer;
4343

44+
private boolean autoQuitAskedFor = false;
45+
4446
@SuppressWarnings("unchecked")
4547
public T withCapabilities(DesiredCapabilities desiredCapabilities) {
4648
markCapabilitiesWereSet();
@@ -115,4 +117,26 @@ public T autoDriverDownload(Consumer<BrowserManager> configurer) {
115117
return (T) this;
116118
}
117119

120+
/**
121+
* Configures the WebDriver to automatically close when the JVM shuts down.
122+
* @return A self reference, allowing further configuration of the driver builder.
123+
* @since 0.18.0
124+
*/
125+
@SuppressWarnings("unchecked")
126+
public T autoQuitDriver() {
127+
this.autoQuitAskedFor = true;
128+
return (T) this;
129+
}
130+
131+
protected void autoQuitDriverIfAskedFor(WebDriver driver) {
132+
if (this.autoQuitAskedFor) {
133+
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
134+
synchronized (driver) {
135+
LOGGER.warn("Quitting driver automatically now: " + driver);
136+
driver.quit();
137+
}
138+
}));
139+
}
140+
}
141+
118142
}

src/main/java/io/github/seleniumquery/browser/driver/builders/ChromeDriverBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ public ChromeDriverBuilder withPathToChromeDriver(String pathToChromeDriver) {
119119
@Override
120120
protected WebDriver build() {
121121
autoDownloadDriverIfAskedFor(ChromeDriver.class);
122+
WebDriver webDriver = buildChrome();
123+
autoQuitDriverIfAskedFor(webDriver);
124+
return webDriver;
125+
}
126+
127+
private WebDriver buildChrome() {
122128
if (isCapabilitiesManuallySet()) {
123129
LOGGER.warn("Prefer using ChromeOptions and .withOptions() instead of DesiredCapabilities and .withCapabilities().");
124130
return buildUsingCapabilities();

src/main/java/io/github/seleniumquery/browser/driver/builders/EdgeDriverBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ public EdgeDriverBuilder withOptions(EdgeOptions edgeOptions) {
6767
@Override
6868
protected WebDriver build() {
6969
autoDownloadDriverIfAskedFor(EdgeDriver.class);
70+
WebDriver webDriver = buildEdge();
71+
autoQuitDriverIfAskedFor(webDriver);
72+
return webDriver;
73+
}
74+
75+
private WebDriver buildEdge() {
7076
if (isCapabilitiesManuallySet()) {
7177
LOGGER.warn("Prefer using EdgeOptions and .withOptions() instead of DesiredCapabilities and " +
7278
".withCapabilities().");

src/main/java/io/github/seleniumquery/browser/driver/builders/FirefoxDriverBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ public FirefoxDriverBuilder withProfile(FirefoxProfile firefoxProfile) {
6262
@Override
6363
protected WebDriver build() {
6464
autoDownloadDriverIfAskedFor(FirefoxDriver.class);
65+
WebDriver webDriver = buildFirefox();
66+
autoQuitDriverIfAskedFor(webDriver);
67+
return webDriver;
68+
}
69+
70+
private WebDriver buildFirefox() {
6571
DesiredCapabilities capabilities = createConfiguredCapabilities();
6672
return new FirefoxDriver(capabilities);
6773
}

src/main/java/io/github/seleniumquery/browser/driver/builders/HtmlUnitDriverBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ public HtmlUnitDriverBuilder emulatingInternetExplorer() {
102102

103103
@Override
104104
protected WebDriver build() {
105+
WebDriver webDriver = buildHtmlUnit();
106+
autoQuitDriverIfAskedFor(webDriver);
107+
return webDriver;
108+
}
109+
110+
private WebDriver buildHtmlUnit() {
105111
DesiredCapabilities capabilities = capabilities(DesiredCapabilities.htmlUnit());
106112
overwriteCapabilityIfValueNotNull(capabilities, VERSION, this.emulatedBrowserName);
107113
overwriteCapabilityIfValueNotNull(capabilities, SUPPORTS_JAVASCRIPT, this.javaScriptEnabled);

src/main/java/io/github/seleniumquery/browser/driver/builders/InternetExplorerDriverBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ public InternetExplorerDriverBuilder withPathToIEDriverServerExe(String pathToIE
7373
@Override
7474
protected WebDriver build() {
7575
autoDownloadDriverIfAskedFor(InternetExplorerDriver.class);
76+
WebDriver webDriver = buildIE();
77+
autoQuitDriverIfAskedFor(webDriver);
78+
return webDriver;
79+
}
80+
81+
private WebDriver buildIE() {
7682
DesiredCapabilities capabilities = capabilities(DesiredCapabilities.chrome());
7783

7884
configureIEServerExecutablePath();

src/main/java/io/github/seleniumquery/browser/driver/builders/OperaDriverBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ public OperaDriverBuilder withBinary(File path) {
115115
@Override
116116
protected WebDriver build() {
117117
autoDownloadDriverIfAskedFor(OperaDriver.class);
118+
WebDriver webDriver = buildOpera();
119+
autoQuitDriverIfAskedFor(webDriver);
120+
return webDriver;
121+
}
122+
123+
private WebDriver buildOpera() {
118124
if (isCapabilitiesManuallySet()) {
119125
LOGGER.warn("Prefer using OperaOptions and .withOptions() instead of DesiredCapabilities and " +
120126
".withCapabilities().");

src/main/java/io/github/seleniumquery/browser/driver/builders/PhantomJSDriverBuilder.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
*/
4242
public class PhantomJSDriverBuilder extends DriverBuilder<PhantomJSDriverBuilder> {
4343

44-
public static final String PHANTOMJS_EXECUTABLE_PATH_PROPERTY = PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY;
44+
private static final String PHANTOMJS_EXECUTABLE_PATH_PROPERTY = PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY;
4545

4646
private static final String EXCEPTION_MESSAGE = " \nDownload the latest release at http://phantomjs.org/download.html and place it: \n" +
4747
"(1) on the classpath of this project; or\n" +
@@ -67,7 +67,7 @@ public PhantomJSDriverBuilder() {
6767
this(SystemUtils.IS_OS_WINDOWS, PHANTOMJS_EXECUTABLE_WINDOWS, PHANTOMJS_EXECUTABLE_LINUX);
6868
}
6969

70-
public PhantomJSDriverBuilder(boolean isWindowsOS, String phantomjsExecutableWindows, String phantomjsExecutableLinux) {
70+
PhantomJSDriverBuilder(boolean isWindowsOS, String phantomjsExecutableWindows, String phantomjsExecutableLinux) {
7171
this.isWindowsOS = isWindowsOS;
7272
this.phantomjsExecutableWindows = phantomjsExecutableWindows;
7373
this.phantomjsExecutableLinux = phantomjsExecutableLinux;
@@ -86,6 +86,12 @@ public PhantomJSDriverBuilder withPathToPhantomJS(String pathToPhantomJs) {
8686
@Override
8787
protected WebDriver build() {
8888
autoDownloadDriverIfAskedFor(PhantomJSDriver.class);
89+
WebDriver webDriver = buildPhantomJS();
90+
autoQuitDriverIfAskedFor(webDriver);
91+
return webDriver;
92+
}
93+
94+
private WebDriver buildPhantomJS() {
8995
DesiredCapabilities capabilities = capabilities(new DesiredCapabilities());
9096

9197
configurePhantomJsExecutablePath(capabilities);

src/test/java/endtoend/browser/driver/builders/HtmlUnitDriverBuilderTest.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class HtmlUnitDriverBuilderTest {
3535
public static final String HTMLUNIT_FF_AGENT_STRING = "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0";
3636

3737
@After
38-
public void tearDown() throws Exception {
38+
public void tearDown() {
3939
$.driver().quit();
4040
}
4141

@@ -49,7 +49,7 @@ public void useHtmlUnit__should_have_js_ON_by_default() {
4949
}
5050

5151
@Test
52-
public void useHtmlUnit__should_emulate_CHROME_by_default() throws Exception {
52+
public void useHtmlUnit__should_emulate_CHROME_by_default() {
5353
// given
5454
// when
5555
$.driver().useHtmlUnit();
@@ -104,4 +104,10 @@ public void emulatingInternetExplorer__should_emulate_latest_IE() {
104104
BrowserAgentTestUtils.assertBrowserAgent(HTMLUNIT_IE_AGENT_STRING);
105105
}
106106

107+
@Test
108+
public void autoQuit__compiles() {
109+
// this is here just to test compilation... I don't really know how to test this, for HtmlUnit or any other driver...
110+
$.driver().useHtmlUnit().autoQuitDriver();
111+
}
112+
107113
}

0 commit comments

Comments
 (0)