Skip to content

Commit a7c9ad1

Browse files
authored
Upgrade to Selenium 4.22.0; use remote HtmlUnitDriver (#272)
1 parent 7dd8352 commit a7c9ad1

39 files changed

+291
-162
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@ repositories {
237237

238238
dependencies {
239239
constraints {
240-
api 'com.nordstrom.tools:java-utils:3.1.1'
240+
api 'com.nordstrom.tools:java-utils:3.2.1'
241241
api 'com.nordstrom.tools:settings:3.0.5'
242-
api 'com.nordstrom.tools:junit-foundation:17.0.4'
242+
api 'com.nordstrom.tools:junit-foundation:17.1.1'
243243
api 'com.github.sbabcoc:logback-testng:2.0.0'
244244
api 'org.hamcrest:hamcrest-core:2.2'
245245
api 'org.yaml:snakeyaml:1.33'

htmlunitDeps.gradle

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ System.setProperty('selenium.browser.name', 'htmlunit')
44
System.setProperty('selenium.context.platform', 'web-app')
55
dependencies {
66
if ("${profile}" == "selenium4") {
7-
testImplementation('org.seleniumhq.selenium:htmlunit3-driver') {
8-
exclude module: 'selenium-support'
9-
}
7+
testImplementation 'com.nordstrom.ui-tools:htmlunit-remote'
108
} else {
119
testImplementation('org.seleniumhq.selenium:htmlunit-driver') {
1210
exclude module: 'selenium-support'

selenium3Deps.gradle

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ sourceSets {
2424

2525
dependencies {
2626
constraints {
27-
api 'com.nordstrom.tools:testng-foundation:4.0.4-j8'
27+
api 'com.nordstrom.tools:testng-foundation:5.1.1-j8'
2828
api 'org.seleniumhq.selenium:selenium-server:3.141.59'
2929
api 'org.seleniumhq.selenium:selenium-support:3.141.59'
3030
api 'org.seleniumhq.selenium:selenium-chrome-driver:3.141.59'
@@ -38,7 +38,6 @@ dependencies {
3838
api 'org.apache.httpcomponents:httpclient:4.5.14'
3939
api 'org.jsoup:jsoup:1.15.3'
4040
api 'org.apache.commons:commons-lang3:3.12.0'
41-
api 'com.google.guava:guava:31.1-jre'
4241
api 'com.beust:jcommander:1.82'
4342
api 'com.squareup.okhttp3:okhttp:4.10.0'
4443
api 'com.squareup.okio:okio:2.10.0'
@@ -57,7 +56,6 @@ dependencies {
5756
api 'org.apache.httpcomponents:httpclient'
5857
api 'org.jsoup:jsoup'
5958
api 'org.apache.commons:commons-lang3'
60-
api 'com.google.guava:guava'
6159
api 'com.beust:jcommander'
6260
api 'com.squareup.okhttp3:okhttp'
6361
api 'com.squareup.okio:okio'

selenium4Deps.gradle

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,22 @@ sourceSets {
2424

2525
dependencies {
2626
constraints {
27-
api 'com.nordstrom.tools:testng-foundation:4.0.4-j8'
28-
api 'org.seleniumhq.selenium:selenium-grid:4.19.0'
29-
api 'org.seleniumhq.selenium:selenium-support:4.19.0'
30-
api 'org.seleniumhq.selenium:selenium-chrome-driver:4.19.0'
31-
api 'org.seleniumhq.selenium:selenium-edge-driver:4.19.0'
32-
api 'org.seleniumhq.selenium:selenium-firefox-driver:4.19.0'
27+
api 'com.nordstrom.tools:testng-foundation:5.1.1-j11'
28+
api 'org.seleniumhq.selenium:selenium-grid:4.22.0'
29+
api 'org.seleniumhq.selenium:selenium-support:4.22.0'
30+
api 'org.seleniumhq.selenium:selenium-chrome-driver:4.22.0'
31+
api 'org.seleniumhq.selenium:selenium-edge-driver:4.22.0'
32+
api 'org.seleniumhq.selenium:selenium-firefox-driver:4.22.0'
3333
api 'org.seleniumhq.selenium:selenium-opera-driver:4.4.0'
34-
api 'org.seleniumhq.selenium:selenium-safari-driver:4.19.0'
35-
api 'org.seleniumhq.selenium:htmlunit3-driver:4.18.1'
34+
api 'org.seleniumhq.selenium:selenium-safari-driver:4.22.0'
35+
api 'com.nordstrom.ui-tools:htmlunit-remote:4.22.0'
36+
api 'org.seleniumhq.selenium:htmlunit3-driver:4.22.0'
37+
api 'org.htmlunit:htmlunit:4.2.0'
3638
api 'com.codeborne:phantomjsdriver:1.5.0'
3739
api 'org.apache.httpcomponents:httpclient:4.5.14'
3840
api 'org.eclipse.jetty:jetty-servlet:9.4.50.v20221201'
3941
api 'org.jsoup:jsoup:1.15.3'
4042
api 'org.apache.commons:commons-lang3:3.12.0'
41-
api ('com.google.guava:guava') {
42-
version { strictly '31.1-jre' }
43-
}
4443
api 'com.beust:jcommander:1.82'
4544
api 'io.netty:netty-transport-native-epoll:4.1.93.Final'
4645
api 'io.netty:netty-transport-native-kqueue:4.1.93.Final'
@@ -54,8 +53,6 @@ dependencies {
5453
api 'org.eclipse.jetty:jetty-servlet'
5554
api 'org.jsoup:jsoup'
5655
api 'org.apache.commons:commons-lang3'
57-
api 'com.google.guava:guava'
5856
api 'com.beust:jcommander'
59-
api 'org.seleniumhq.selenium:htmlunit3-driver' // temporary
6057
testImplementation 'org.mockito:mockito-core'
6158
}

src/main/java/com/nordstrom/automation/selenium/AbstractSeleniumConfig.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import java.util.Map;
1818
import java.util.Objects;
1919
import java.util.Set;
20+
import java.util.stream.Collectors;
21+
import java.util.stream.Stream;
22+
2023
import org.apache.commons.configuration2.ex.ConfigurationException;
2124
import org.apache.commons.configuration2.io.FileHandler;
2225
import org.apache.commons.configuration2.io.FileLocationStrategy;
@@ -29,9 +32,6 @@
2932
import org.slf4j.Logger;
3033
import org.slf4j.LoggerFactory;
3134

32-
import com.google.common.base.Charsets;
33-
import com.google.common.base.Strings;
34-
import com.google.common.io.Resources;
3535
import com.nordstrom.automation.selenium.core.GridUtility;
3636
import com.nordstrom.automation.selenium.core.SeleniumGrid;
3737
import com.nordstrom.automation.selenium.servlet.ExamplePageLauncher;
@@ -589,8 +589,9 @@ public String resolveString(String propertyName) {
589589
try {
590590
// load contents of value file
591591
Path path = Paths.get(valuePath);
592-
URL url = path.toUri().toURL();
593-
propertyValue = Resources.toString(url, Charsets.UTF_8);
592+
try (Stream<String> lines = Files.lines(path)) {
593+
propertyValue = lines.collect(Collectors.joining("\n"));
594+
}
594595
} catch (IOException eaten) {
595596
// nothing to do here
596597
}
@@ -652,6 +653,8 @@ public boolean shutdownGrid(final boolean localOnly) throws InterruptedException
652653
ExamplePageLauncher.getLauncher().shutdown();
653654
seleniumGrid = null;
654655
}
656+
} else {
657+
ExamplePageLauncher.getLauncher().shutdown();
655658
}
656659
return result;
657660
}
@@ -755,9 +758,9 @@ public Capabilities getCurrentCapabilities() {
755758
Capabilities capabilities = null;
756759
String browserName = getString(SeleniumSettings.BROWSER_NAME.key());
757760
String browserCaps = resolveString(SeleniumSettings.BROWSER_CAPS.key());
758-
if (!Strings.isNullOrEmpty(browserName)) {
761+
if (!(browserName == null || browserName.isEmpty())) {
759762
capabilities = getSeleniumGrid().getPersonality(getConfig(), browserName);
760-
} else if (!Strings.isNullOrEmpty(browserCaps)) {
763+
} else if (!(browserCaps == null || browserCaps.isEmpty())) {
761764
capabilities = getCapabilitiesForJson(browserCaps)[0];
762765
} else {
763766
throw new IllegalStateException("Neither browser name nor capabilities are specified");
@@ -962,7 +965,7 @@ public Set<String> getHubServlets() {
962965
// get specified hub servlet classes
963966
String hubServlets = getString(SeleniumSettings.HUB_SERVLETS.key());
964967
// if servlets are specified
965-
if ( ! Strings.isNullOrEmpty(hubServlets)) {
968+
if (!(hubServlets == null || hubServlets.isEmpty())) {
966969
// collect servlet names, minus leading/trailing white space
967970
servlets.addAll(Arrays.asList(hubServlets.trim().split("\\s*,\\s*")));
968971
}
@@ -988,7 +991,7 @@ public Set<String> getNodeServlets() {
988991
// get specified node servlet classes
989992
String nodeServlets = getString(SeleniumSettings.NODE_SERVLETS.key());
990993
// if servlets are specified
991-
if ( ! Strings.isNullOrEmpty(nodeServlets)) {
994+
if (!(nodeServlets == null || nodeServlets.isEmpty())) {
992995
// collect servlet names, minus leading/trailing white space
993996
servlets.addAll(Arrays.asList(nodeServlets.trim().split("\\s*,\\s*")));
994997
}

src/main/java/com/nordstrom/automation/selenium/core/DriverManager.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import java.lang.reflect.Method;
44
import java.time.Duration;
5+
import java.util.Optional;
56
import java.util.concurrent.TimeUnit;
7+
import java.util.function.Function;
68

79
import org.openqa.selenium.JavascriptExecutor;
810
import org.openqa.selenium.WebDriver;
@@ -11,8 +13,6 @@
1113
import org.openqa.selenium.remote.RemoteWebDriver;
1214
import org.openqa.selenium.remote.SessionId;
1315
import org.openqa.selenium.support.ui.FluentWait;
14-
import com.google.common.base.Function;
15-
import com.google.common.base.Optional;
1616
import com.nordstrom.automation.selenium.AbstractSeleniumConfig.SeleniumSettings;
1717
import com.nordstrom.automation.selenium.AbstractSeleniumConfig.WaitType;
1818
import com.nordstrom.automation.selenium.SeleniumConfig;
@@ -200,7 +200,7 @@ public static Optional<WebDriver> nabDriver(final Object obj) {
200200
if (obj instanceof TestBase) {
201201
return ((TestBase) obj).nabDriver();
202202
} else {
203-
return Optional.absent();
203+
return Optional.empty();
204204
}
205205
}
206206

@@ -227,7 +227,7 @@ public static Optional<SessionId> getSessionId(final WebDriver driver) {
227227
SessionId sessionId = ((RemoteWebDriver) driver).getSessionId();
228228
return Optional.of(sessionId);
229229
}
230-
return Optional.absent();
230+
return Optional.empty();
231231
}
232232

233233
/**
@@ -242,7 +242,7 @@ public static Optional<WebDriver> closeDriver(final Object obj) {
242242
WebDriver driver = optDriver.get();
243243

244244
try {
245-
((JavascriptExecutor) driver).executeScript("return window.stop");
245+
((JavascriptExecutor) driver).executeScript("window.stop();");
246246
} catch (WebDriverException | UnsupportedOperationException eaten) {
247247
// Let's make sure our graceful shutdown process doesn't cause failures.
248248
}
@@ -255,7 +255,7 @@ public static Optional<WebDriver> closeDriver(final Object obj) {
255255

256256
((TestBase) obj).setInitialPage(null);
257257
((TestBase) obj).setDriver(null);
258-
optDriver = Optional.absent();
258+
optDriver = Optional.empty();
259259
driver.quit();
260260
}
261261

src/main/java/com/nordstrom/automation/selenium/core/GridUtility.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.slf4j.Logger;
4141
import org.slf4j.LoggerFactory;
4242

43-
import com.google.common.collect.ImmutableList;
4443
import com.nordstrom.automation.selenium.AbstractSeleniumConfig.SeleniumSettings;
4544
import com.nordstrom.automation.selenium.DriverPlugin;
4645
import com.nordstrom.automation.selenium.SeleniumConfig;
@@ -357,13 +356,12 @@ private static <T extends RemoteWebDriver> Constructor<T> getRemoteWebDriverCtor
357356
* @return list of driver plugin instances
358357
*/
359358
public static List<DriverPlugin> getDriverPlugins(SeleniumConfig config) {
360-
List<DriverPlugin> driverPlugins;
359+
List<DriverPlugin> driverPlugins = new ArrayList<>();
361360

362361
// get grid plugins setting
363362
String gridPlugins = config.getString(SeleniumSettings.GRID_PLUGINS.key());
364363
// if setting is defined and not empty
365364
if ( ! (gridPlugins == null || gridPlugins.trim().isEmpty())) {
366-
driverPlugins = new ArrayList<>();
367365
// iterate specified driver plugin class names
368366
for (String driverPlugin : gridPlugins.split(File.pathSeparator)) {
369367
String className = driverPlugin.trim();
@@ -394,7 +392,7 @@ public static List<DriverPlugin> getDriverPlugins(SeleniumConfig config) {
394392
// get service loader for driver plugins
395393
ServiceLoader<DriverPlugin> serviceLoader = ServiceLoader.load(DriverPlugin.class);
396394
// collect list of configured plugins
397-
driverPlugins = ImmutableList.copyOf(serviceLoader.iterator());
395+
serviceLoader.iterator().forEachRemaining(driverPlugins::add);
398396
}
399397

400398
return driverPlugins;

src/main/java/com/nordstrom/automation/selenium/core/JsUtility.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.nordstrom.automation.selenium.core;
22

3+
import static java.nio.charset.StandardCharsets.UTF_8;
4+
import static com.nordstrom.automation.selenium.servlet.ExamplePageServlet.readAllBytes;
5+
36
import java.io.IOException;
7+
import java.io.InputStream;
48
import java.lang.reflect.Constructor;
59
import java.lang.reflect.InvocationTargetException;
6-
import java.net.URL;
710
import java.util.Arrays;
811
import java.util.HashMap;
912
import java.util.List;
@@ -21,8 +24,6 @@
2124
import org.slf4j.Logger;
2225
import org.slf4j.LoggerFactory;
2326

24-
import com.google.common.base.Charsets;
25-
import com.google.common.io.Resources;
2627
import com.nordstrom.automation.selenium.exceptions.DocumentNotReadyTimeoutException;
2728
import com.nordstrom.automation.selenium.model.FirefoxShadowRoot;
2829
import com.nordstrom.automation.selenium.support.Coordinator;
@@ -213,9 +214,11 @@ public static void injectGlueLib(final WebDriver driver) {
213214
* @return resource file content
214215
*/
215216
public static String getScriptResource(final String resource) {
216-
URL url = Resources.getResource(resource);
217+
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
217218
try {
218-
return Resources.toString(url, Charsets.UTF_8);
219+
try (InputStream is = classLoader.getResourceAsStream(resource)) {
220+
return (is != null) ? new String(readAllBytes(is), UTF_8) : null;
221+
}
219222
} catch (IOException e) {
220223
throw new IllegalArgumentException("Failed to load JavaScript resource '" + resource + "'", e);
221224
}

src/main/java/com/nordstrom/automation/selenium/core/TestBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.nordstrom.automation.selenium.core;
22

33
import java.lang.reflect.Method;
4+
import java.util.Optional;
45

56
import org.openqa.selenium.WebDriver;
67
import org.openqa.selenium.WebDriverException;
78

8-
import com.google.common.base.Optional;
99
import com.nordstrom.automation.selenium.exceptions.DriverNotAvailableException;
1010
import com.nordstrom.automation.selenium.exceptions.InitialPageNotSpecifiedException;
1111
import com.nordstrom.automation.selenium.model.Page;
@@ -156,7 +156,7 @@ public static <T> Optional<T> optionalOf(T obj) {
156156
if (obj != null) {
157157
return Optional.of(obj);
158158
} else {
159-
return Optional.absent();
159+
return Optional.empty();
160160
}
161161
}
162162

src/main/java/com/nordstrom/automation/selenium/examples/ExamplePage.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,8 @@ public static URI setHubAsTarget() {
258258
try {
259259
// if running Selenium 4+
260260
if (config.getVersion() > 3) {
261+
// ensure example page servlet is running
262+
ExamplePageLauncher.getLauncher().start();
261263
// get URI of example page servlet
262264
targetUri = ExamplePageLauncher.getLauncher().getUrl().toURI();
263265
} else {

0 commit comments

Comments
 (0)