Skip to content

Commit a3b6153

Browse files
committed
refactor(browser): simplify headless argument handling
1 parent 52e8910 commit a3b6153

File tree

2 files changed

+71
-49
lines changed

2 files changed

+71
-49
lines changed

src/main/java/io/github/burakkaygusuz/config/Browser.java

Lines changed: 64 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,28 @@
88
import org.openqa.selenium.remote.AbstractDriverOptions;
99

1010
import java.util.Collections;
11-
import java.util.HashMap;
1211
import java.util.Map;
1312

1413
public enum Browser {
1514

1615
CHROME {
1716
@Override
1817
protected ChromeOptions getOptions() {
19-
Map<String, Object> prefs = Map.ofEntries(
20-
Map.entry("profile.default_content_setting_values.notifications", 2),
21-
Map.entry("profile.managed_default_content_settings.javascript", 1),
22-
Map.entry("credentials_enable_service", false),
23-
Map.entry("profile.password_manager_enabled", false));
24-
2518
final ChromeOptions chromeOptions = new ChromeOptions();
26-
chromeOptions
27-
.enableBiDi()
28-
.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"))
29-
.setExperimentalOption("prefs", prefs)
30-
.addArguments("--disable-gpu", "--disable-logging", "--disable-dev-shm-usage")
31-
.setPageLoadStrategy(PageLoadStrategy.NORMAL)
32-
.setAcceptInsecureCerts(true);
19+
applyCommonOptions(chromeOptions);
20+
chromeOptions.setExperimentalOption("prefs", getCommonPrefs());
3321
return chromeOptions;
3422
}
23+
24+
@Override
25+
protected String getHeadlessArgument() {
26+
return "headless=new";
27+
}
28+
29+
@Override
30+
protected void addHeadlessArgument(AbstractDriverOptions<?> options) {
31+
((ChromeOptions) options).addArguments(getHeadlessArgument());
32+
}
3533
},
3634
FIREFOX {
3735
@Override
@@ -51,26 +49,35 @@ protected FirefoxOptions getOptions() {
5149
.setProfile(firefoxProfile);
5250
return firefoxOptions;
5351
}
52+
53+
@Override
54+
protected String getHeadlessArgument() {
55+
return "-headless";
56+
}
57+
58+
@Override
59+
protected void addHeadlessArgument(AbstractDriverOptions<?> options) {
60+
((FirefoxOptions) options).addArguments(getHeadlessArgument());
61+
}
5462
},
5563
EDGE {
5664
@Override
5765
protected EdgeOptions getOptions() {
58-
Map<String, Object> prefs = Map.ofEntries(
59-
Map.entry("profile.default_content_setting_values.notifications", 2),
60-
Map.entry("profile.managed_default_content_settings.javascript", 1),
61-
Map.entry("credentials_enable_service", false),
62-
Map.entry("profile.password_manager_enabled", false));
63-
6466
final EdgeOptions edgeOptions = new EdgeOptions();
65-
edgeOptions
66-
.enableBiDi()
67-
.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"))
68-
.setExperimentalOption("prefs", prefs)
69-
.addArguments("--disable-gpu", "--disable-logging", "--disable-dev-shm-usage")
70-
.setPageLoadStrategy(PageLoadStrategy.NORMAL)
71-
.setAcceptInsecureCerts(true);
67+
applyCommonOptions(edgeOptions);
68+
edgeOptions.setExperimentalOption("prefs", getCommonPrefs());
7269
return edgeOptions;
7370
}
71+
72+
@Override
73+
protected String getHeadlessArgument() {
74+
return "headless=new";
75+
}
76+
77+
@Override
78+
protected void addHeadlessArgument(AbstractDriverOptions<?> options) {
79+
((EdgeOptions) options).addArguments(getHeadlessArgument());
80+
}
7481
};
7582

7683
@Override
@@ -79,4 +86,34 @@ public String toString() {
7986
}
8087

8188
protected abstract AbstractDriverOptions<?> getOptions();
89+
90+
protected abstract String getHeadlessArgument();
91+
92+
protected abstract void addHeadlessArgument(AbstractDriverOptions<?> options);
93+
94+
private static Map<String, Object> getCommonPrefs() {
95+
return Map.ofEntries(
96+
Map.entry("profile.default_content_setting_values.notifications", 2),
97+
Map.entry("profile.managed_default_content_settings.javascript", 1),
98+
Map.entry("credentials_enable_service", false),
99+
Map.entry("profile.password_manager_enabled", false));
100+
}
101+
102+
private static void applyCommonOptions(ChromeOptions options) {
103+
options
104+
.enableBiDi()
105+
.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"))
106+
.addArguments("--disable-gpu", "--disable-logging", "--disable-dev-shm-usage")
107+
.setPageLoadStrategy(PageLoadStrategy.NORMAL)
108+
.setAcceptInsecureCerts(true);
109+
}
110+
111+
private static void applyCommonOptions(EdgeOptions options) {
112+
options
113+
.enableBiDi()
114+
.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"))
115+
.addArguments("--disable-gpu", "--disable-logging", "--disable-dev-shm-usage")
116+
.setPageLoadStrategy(PageLoadStrategy.NORMAL)
117+
.setAcceptInsecureCerts(true);
118+
}
82119
}

src/main/java/io/github/burakkaygusuz/config/WebDriverBuilder.java

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
import io.github.burakkaygusuz.listeners.CustomWebDriverListener;
55
import org.apache.logging.log4j.ThreadContext;
66
import org.openqa.selenium.WebDriver;
7-
import org.openqa.selenium.chrome.ChromeOptions;
8-
import org.openqa.selenium.edge.EdgeOptions;
9-
import org.openqa.selenium.firefox.FirefoxOptions;
7+
import org.openqa.selenium.WebDriverException;
108
import org.openqa.selenium.remote.AbstractDriverOptions;
119
import org.openqa.selenium.remote.RemoteWebDriver;
1210
import org.openqa.selenium.support.events.EventFiringDecorator;
@@ -41,23 +39,10 @@ public WebDriverBuilder enableTracing(boolean isTracingEnabled) {
4139
}
4240

4341
public WebDriverBuilder enableHeadless() {
44-
switch (browser) {
45-
case "chrome" -> {
46-
final ChromeOptions chromeOptions = new ChromeOptions();
47-
chromeOptions.addArguments("headless=new");
48-
options.merge(chromeOptions);
49-
}
50-
case "firefox" -> {
51-
final FirefoxOptions firefoxOptions = new FirefoxOptions();
52-
firefoxOptions.addArguments("-headless");
53-
options.merge(firefoxOptions);
54-
}
55-
case "edge" -> {
56-
final EdgeOptions edgeOptions = new EdgeOptions();
57-
edgeOptions.addArguments("headless=new");
58-
options.merge(edgeOptions);
59-
}
60-
default -> throw new UnsupportedBrowserException("Browser does not exist: %s".formatted(browser));
42+
try {
43+
Browser.valueOf(browser.toUpperCase()).addHeadlessArgument(options);
44+
} catch (IllegalArgumentException e) {
45+
throw new UnsupportedBrowserException("Browser does not exist: %s".formatted(browser));
6146
}
6247
return this;
6348
}
@@ -68,8 +53,8 @@ public WebDriver build() {
6853
: new RemoteWebDriver(options, isTracingEnabled));
6954
WebDriver original = DRIVER_THREAD_LOCAL.get();
7055
return new EventFiringDecorator<>(new CustomWebDriverListener()).decorate(original);
71-
} finally {
72-
DRIVER_THREAD_LOCAL.remove();
56+
} catch (Exception e) {
57+
throw new WebDriverException("Failed to build WebDriver", e);
7358
}
7459
}
7560
}

0 commit comments

Comments
 (0)