Skip to content

Commit b86d847

Browse files
authored
Add methods to options classes for w3c compliant capabilities (#9828)
1 parent 2c071c8 commit b86d847

File tree

4 files changed

+129
-8
lines changed

4 files changed

+129
-8
lines changed

java/src/org/openqa/selenium/remote/AbstractDriverOptions.java

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,67 @@
1717

1818
package org.openqa.selenium.remote;
1919

20-
import static org.openqa.selenium.remote.CapabilityType.ACCEPT_INSECURE_CERTS;
21-
import static org.openqa.selenium.remote.CapabilityType.PAGE_LOAD_STRATEGY;
22-
import static org.openqa.selenium.remote.CapabilityType.PROXY;
23-
import static org.openqa.selenium.remote.CapabilityType.STRICT_FILE_INTERACTABILITY;
24-
import static org.openqa.selenium.remote.CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR;
25-
import static org.openqa.selenium.remote.CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR;
26-
2720
import org.openqa.selenium.MutableCapabilities;
2821
import org.openqa.selenium.PageLoadStrategy;
2922
import org.openqa.selenium.Proxy;
3023
import org.openqa.selenium.UnexpectedAlertBehaviour;
3124
import org.openqa.selenium.internal.Require;
3225

26+
import java.time.Duration;
3327
import java.util.Collections;
28+
import java.util.HashMap;
3429
import java.util.Map;
3530
import java.util.Set;
3631
import java.util.TreeMap;
3732
import java.util.TreeSet;
3833

34+
import static org.openqa.selenium.remote.CapabilityType.ACCEPT_INSECURE_CERTS;
35+
import static org.openqa.selenium.remote.CapabilityType.BROWSER_VERSION;
36+
import static org.openqa.selenium.remote.CapabilityType.PAGE_LOAD_STRATEGY;
37+
import static org.openqa.selenium.remote.CapabilityType.PLATFORM_NAME;
38+
import static org.openqa.selenium.remote.CapabilityType.PROXY;
39+
import static org.openqa.selenium.remote.CapabilityType.STRICT_FILE_INTERACTABILITY;
40+
import static org.openqa.selenium.remote.CapabilityType.TIMEOUTS;
41+
import static org.openqa.selenium.remote.CapabilityType.UNHANDLED_PROMPT_BEHAVIOUR;
42+
3943
public abstract class AbstractDriverOptions<DO extends AbstractDriverOptions> extends MutableCapabilities {
44+
public DO setBrowserVersion(String browserVersion) {
45+
setCapability(
46+
BROWSER_VERSION,
47+
Require.nonNull("Browser version", browserVersion));
48+
return (DO) this;
49+
}
50+
51+
public DO setPlatformName(String platformName) {
52+
setCapability(
53+
PLATFORM_NAME,
54+
Require.nonNull("Platform Name", platformName));
55+
return (DO) this;
56+
}
57+
58+
public DO setImplicitWaitTimeout(Duration timeout) {
59+
Map<String, Number> timeouts = getTimeouts();
60+
timeouts.put("implicit", timeout.toMillis());
61+
62+
setCapability(TIMEOUTS, Collections.unmodifiableMap(timeouts));
63+
return (DO) this;
64+
}
65+
66+
public DO setPageLoadTimeout(Duration timeout) {
67+
Map<String, Number> timeouts = getTimeouts();
68+
timeouts.put("pageLoad", timeout.toMillis());
69+
70+
setCapability(TIMEOUTS, Collections.unmodifiableMap(timeouts));
71+
return (DO) this;
72+
}
73+
74+
public DO setScriptTimeout(Duration timeout) {
75+
Map<String, Number> timeouts = getTimeouts();
76+
timeouts.put("script", timeout.toMillis());
77+
78+
setCapability(TIMEOUTS, Collections.unmodifiableMap(timeouts));
79+
return (DO) this;
80+
}
4081

4182
public DO setPageLoadStrategy(PageLoadStrategy strategy) {
4283
setCapability(
@@ -94,4 +135,15 @@ public Map<String, Object> asMap() {
94135
getExtraCapabilityNames().forEach(name -> toReturn.put(name, getCapability(name)));
95136
return Collections.unmodifiableMap(toReturn);
96137
}
138+
139+
private Map<String, Number> getTimeouts() {
140+
Map<String, Number> newTimeouts = new HashMap<>();
141+
Object raw = getCapability(TIMEOUTS);
142+
((Map<?, ?>) raw).forEach((key, value) -> {
143+
if (key instanceof String && value instanceof Number) {
144+
newTimeouts.put((String) key, (Number) value);
145+
}
146+
});
147+
return newTimeouts;
148+
}
97149
}

java/src/org/openqa/selenium/remote/CapabilityType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public interface CapabilityType {
4747
String HAS_TOUCHSCREEN = "hasTouchScreen";
4848
String OVERLAPPING_CHECK_DISABLED = "overlappingCheckDisabled";
4949
String STRICT_FILE_INTERACTABILITY = "strictFileInteractability";
50+
String TIMEOUTS = "timeouts";
5051

5152
String LOGGING_PREFS = "loggingPrefs";
5253

java/test/org/openqa/selenium/chrome/BUILD.bazel

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ java_selenium_test_suite(
2222
artifact("org.assertj:assertj-core"),
2323
artifact("org.mockito:mockito-core"),
2424
],
25+
javacopts = [
26+
"--release",
27+
"11",
28+
],
2529
)

java/test/org/openqa/selenium/chrome/ChromeOptionsTest.java

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,20 @@
1919

2020
import org.junit.Test;
2121
import org.junit.experimental.categories.Category;
22+
import org.openqa.selenium.PageLoadStrategy;
23+
import org.openqa.selenium.UnexpectedAlertBehaviour;
2224
import org.openqa.selenium.remote.AcceptedW3CCapabilityKeys;
2325
import org.openqa.selenium.testing.TestUtilities;
2426
import org.openqa.selenium.testing.UnitTests;
2527

2628
import java.io.File;
29+
import java.time.Duration;
2730
import java.util.Base64;
31+
import java.util.HashMap;
2832
import java.util.List;
2933
import java.util.Map;
3034
import java.util.Set;
3135
import java.util.function.Predicate;
32-
import java.util.stream.Collectors;
3336

3437
import static java.util.stream.Collectors.toSet;
3538
import static org.assertj.core.api.Assertions.assertThat;
@@ -38,6 +41,7 @@
3841
import static org.assertj.core.api.InstanceOfAssertFactories.MAP;
3942
import static org.openqa.selenium.chrome.ChromeDriverLogLevel.OFF;
4043
import static org.openqa.selenium.chrome.ChromeDriverLogLevel.SEVERE;
44+
import static org.openqa.selenium.remote.CapabilityType.TIMEOUTS;
4145

4246
@Category(UnitTests.class)
4347
public class ChromeOptionsTest {
@@ -67,6 +71,66 @@ public void canBuildLogLevelFromStringRepresentation() {
6771
assertThat(ChromeDriverLogLevel.fromString("SEVERE")).isEqualTo(SEVERE);
6872
}
6973

74+
@Test
75+
public void canAddW3CCompliantOptions() {
76+
ChromeOptions chromeOptions = new ChromeOptions();
77+
chromeOptions.setBrowserVersion("99")
78+
.setPlatformName("9 3/4")
79+
.setUnhandledPromptBehaviour(UnexpectedAlertBehaviour.IGNORE)
80+
.setAcceptInsecureCerts(true)
81+
.setPageLoadStrategy(PageLoadStrategy.EAGER)
82+
.setStrictFileInteractability(true)
83+
.setImplicitWaitTimeout(Duration.ofSeconds(1))
84+
.setPageLoadTimeout(Duration.ofSeconds(2))
85+
.setScriptTimeout(Duration.ofSeconds(3));
86+
87+
Map<String, Object> mappedOptions = chromeOptions.asMap();
88+
assertThat(mappedOptions.get("browserName")).isEqualTo("chrome");
89+
assertThat(mappedOptions.get("browserVersion")).isEqualTo("99");
90+
assertThat(mappedOptions.get("platformName")).isEqualTo("9 3/4");
91+
assertThat(mappedOptions.get("unhandledPromptBehavior").toString()).isEqualTo("ignore");
92+
assertThat(mappedOptions.get("acceptInsecureCerts")).isEqualTo(true);
93+
assertThat(mappedOptions.get("pageLoadStrategy").toString()).isEqualTo("eager");
94+
assertThat(mappedOptions.get("strictFileInteractability")).isEqualTo(true);
95+
96+
Map<String, Long> expectedTimeouts = new HashMap<>();
97+
expectedTimeouts.put("implicit", 1000L);
98+
expectedTimeouts.put("pageLoad", 2000L);
99+
expectedTimeouts.put("script", 3000L);
100+
101+
assertThat(expectedTimeouts).isEqualTo(mappedOptions.get("timeouts"));
102+
}
103+
104+
@Test
105+
public void canAddSequentialTimeouts() {
106+
ChromeOptions chromeOptions = new ChromeOptions();
107+
chromeOptions.setImplicitWaitTimeout(Duration.ofSeconds(1));
108+
109+
Map<String, Object> mappedOptions = chromeOptions.asMap();
110+
Map<String, Long> expectedTimeouts = new HashMap<>();
111+
112+
expectedTimeouts.put("implicit", 1000L);
113+
assertThat(expectedTimeouts).isEqualTo(mappedOptions.get("timeouts"));
114+
115+
chromeOptions.setPageLoadTimeout(Duration.ofSeconds(2));
116+
expectedTimeouts.put("pageLoad", 2000L);
117+
Map<String, Object> mappedOptions2 = chromeOptions.asMap();
118+
assertThat(expectedTimeouts).isEqualTo(mappedOptions2.get("timeouts"));
119+
}
120+
121+
@Test
122+
public void mixAddingTimeoutsCapsAndSetter() {
123+
ChromeOptions chromeOptions = new ChromeOptions();
124+
chromeOptions.setCapability(TIMEOUTS, Map.of("implicit", 1000));
125+
chromeOptions.setPageLoadTimeout(Duration.ofSeconds(2));
126+
127+
Map<String, Number> expectedTimeouts = new HashMap<>();
128+
expectedTimeouts.put("implicit", 1000);
129+
expectedTimeouts.put("pageLoad", 2000L);
130+
131+
assertThat(chromeOptions.asMap().get("timeouts")).isEqualTo(expectedTimeouts);
132+
}
133+
70134
@Test
71135
public void mergingOptionsMergesArguments() {
72136
ChromeOptions one = new ChromeOptions().addArguments("verbose");

0 commit comments

Comments
 (0)