Skip to content

Commit 3ad8d80

Browse files
pavelppkiview
authored andcommitted
Use ChromeOptions and FirefoxOptions instead of DesiredCapabilities (#995)
1 parent a8e1708 commit 3ad8d80

16 files changed

+136
-58
lines changed

examples/selenium-container/pom.xml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,17 @@
1515
<dependency>
1616
<groupId>org.seleniumhq.selenium</groupId>
1717
<artifactId>selenium-remote-driver</artifactId>
18-
<version>2.45.0</version>
18+
<version>3.141.59</version>
19+
</dependency>
20+
<dependency>
21+
<groupId>org.seleniumhq.selenium</groupId>
22+
<artifactId>selenium-firefox-driver</artifactId>
23+
<version>3.141.59</version>
24+
</dependency>
25+
<dependency>
26+
<groupId>org.seleniumhq.selenium</groupId>
27+
<artifactId>selenium-chrome-driver</artifactId>
28+
<version>3.141.59</version>
1929
</dependency>
2030
<dependency>
2131
<groupId>${testcontainers.group}</groupId>
@@ -37,4 +47,4 @@
3747
</dependencies>
3848

3949

40-
</project>
50+
</project>

examples/selenium-container/src/test/java/SeleniumContainerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import org.junit.Rule;
22
import org.junit.Test;
33
import org.openqa.selenium.WebElement;
4-
import org.openqa.selenium.remote.DesiredCapabilities;
54
import org.openqa.selenium.remote.RemoteWebDriver;
5+
import org.openqa.selenium.chrome.ChromeOptions;
66
import org.testcontainers.containers.BrowserWebDriverContainer;
77

88
import java.io.File;
@@ -17,7 +17,7 @@ public class SeleniumContainerTest {
1717

1818
@Rule
1919
public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer()
20-
.withDesiredCapabilities(DesiredCapabilities.chrome())
20+
.withCapabilities(new ChromeOptions())
2121
.withRecordingMode(RECORD_ALL, new File("target"));
2222

2323
@Test

modules/selenium/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ description = "Testcontainers :: Selenium"
33
dependencies {
44
compile project(':testcontainers')
55

6-
provided 'org.seleniumhq.selenium:selenium-remote-driver:2.52.0'
6+
provided 'org.seleniumhq.selenium:selenium-remote-driver:3.141.59'
7+
provided 'org.seleniumhq.selenium:selenium-chrome-driver:3.141.59'
8+
testCompile 'org.seleniumhq.selenium:selenium-firefox-driver:3.141.59'
9+
testCompile 'org.seleniumhq.selenium:selenium-support:3.141.59'
710

811
testCompile 'org.mortbay.jetty:jetty:6.1.25'
912
testCompile project(':nginx')

modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package org.testcontainers.containers;
22

3-
import com.github.dockerjava.api.command.InspectContainerResponse;
43
import com.google.common.collect.ImmutableSet;
4+
5+
import com.github.dockerjava.api.command.InspectContainerResponse;
6+
57
import org.jetbrains.annotations.NotNull;
68
import org.jetbrains.annotations.Nullable;
9+
import org.openqa.selenium.Capabilities;
10+
import org.openqa.selenium.chrome.ChromeOptions;
711
import org.openqa.selenium.remote.BrowserType;
812
import org.openqa.selenium.remote.DesiredCapabilities;
913
import org.openqa.selenium.remote.RemoteWebDriver;
@@ -45,7 +49,7 @@ public class BrowserWebDriverContainer<SELF extends BrowserWebDriverContainer<SE
4549
private static final int VNC_PORT = 5900;
4650

4751
@Nullable
48-
private DesiredCapabilities desiredCapabilities;
52+
private Capabilities capabilities;
4953
private boolean customImageNameIsSet = false;
5054

5155
@Nullable
@@ -75,7 +79,7 @@ public BrowserWebDriverContainer() {
7579

7680
/**
7781
* Constructor taking a specific webdriver container name and tag
78-
* @param dockerImageName
82+
* @param dockerImageName Name of the docker image to pull
7983
*/
8084
public BrowserWebDriverContainer(String dockerImageName) {
8185
this();
@@ -86,8 +90,21 @@ public BrowserWebDriverContainer(String dockerImageName) {
8690
}
8791

8892

89-
public SELF withDesiredCapabilities(DesiredCapabilities desiredCapabilities) {
90-
this.desiredCapabilities = desiredCapabilities;
93+
public SELF withCapabilities(Capabilities capabilities) {
94+
this.capabilities = capabilities;
95+
return self();
96+
}
97+
98+
/**
99+
* @deprecated Use withCapabilities(Capabilities capabilities) instead:
100+
* withCapabilities(new FirefoxOptions())
101+
*
102+
* @param capabilities DesiredCapabilities
103+
* @return SELF
104+
* */
105+
@Deprecated
106+
public SELF withDesiredCapabilities(DesiredCapabilities capabilities) {
107+
this.capabilities = capabilities;
91108
return self();
92109
}
93110

@@ -105,8 +122,16 @@ protected Set<Integer> getLivenessCheckPorts() {
105122
@Override
106123
protected void configure() {
107124

108-
if (desiredCapabilities == null) {
109-
throw new IllegalStateException();
125+
String seleniumVersion = SeleniumUtils.determineClasspathSeleniumVersion();
126+
127+
if (capabilities == null) {
128+
if (seleniumVersion.startsWith("2.")) {
129+
logger().info("No capabilities provided, falling back to DesiredCapabilities.chrome()");
130+
capabilities = DesiredCapabilities.chrome();
131+
} else {
132+
logger().info("No capabilities provided, falling back to ChromeOptions");
133+
capabilities = new ChromeOptions();
134+
}
110135
}
111136

112137
if (recordingMode != VncRecordingMode.SKIP) {
@@ -120,7 +145,7 @@ protected void configure() {
120145
}
121146

122147
if (!customImageNameIsSet) {
123-
super.setDockerImageName(getImageForCapabilities(desiredCapabilities));
148+
super.setDockerImageName(getImageForCapabilities(capabilities, seleniumVersion));
124149
}
125150

126151
String timeZone = System.getProperty("user.timezone");
@@ -140,11 +165,9 @@ protected void configure() {
140165
setStartupAttempts(3);
141166
}
142167

143-
public static String getImageForCapabilities(DesiredCapabilities desiredCapabilities) {
168+
public static String getImageForCapabilities(Capabilities capabilities, String seleniumVersion) {
144169

145-
String seleniumVersion = SeleniumUtils.determineClasspathSeleniumVersion();
146-
147-
String browserName = desiredCapabilities.getBrowserName();
170+
String browserName = capabilities.getBrowserName();
148171
switch (browserName) {
149172
case BrowserType.CHROME:
150173
return String.format(CHROME_IMAGE, seleniumVersion);
@@ -184,7 +207,7 @@ protected void containerIsStarted(InspectContainerResponse containerInfo) {
184207
driver = Unreliables.retryUntilSuccess(30, TimeUnit.SECONDS,
185208
Timeouts.getWithTimeout(10, TimeUnit.SECONDS,
186209
() ->
187-
() -> new RemoteWebDriver(getSeleniumAddress(), desiredCapabilities)));
210+
() -> new RemoteWebDriver(getSeleniumAddress(), capabilities)));
188211

189212
if (vncRecordingContainer != null) {
190213
LOGGER.debug("Starting VNC recording");
@@ -282,6 +305,4 @@ public SELF withRecordingFileFactory(RecordingFileFactory recordingFileFactory)
282305
public enum VncRecordingMode {
283306
SKIP, RECORD_ALL, RECORD_FAILING
284307
}
285-
286-
287308
}

modules/selenium/src/main/java/org/testcontainers/containers/SeleniumUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public static String determineClasspathSeleniumVersion() {
6565

6666
/**
6767
* Read Manifest to get Selenium Version.
68-
* @param manifest
68+
* @param manifest manifest
6969
* @return Selenium Version detected
7070
*/
7171
public static String getSeleniumVersionFromManifest(Manifest manifest) {

modules/selenium/src/test/java/org/testcontainers/junit/BaseWebDriverContainerTest.java

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

33
import org.jetbrains.annotations.NotNull;
44
import org.openqa.selenium.By;
5+
import org.openqa.selenium.WebElement;
56
import org.openqa.selenium.remote.RemoteWebDriver;
7+
import org.openqa.selenium.support.ui.ExpectedConditions;
8+
import org.openqa.selenium.support.ui.WebDriverWait;
69
import org.testcontainers.containers.BrowserWebDriverContainer;
710

11+
import java.util.List;
812
import java.util.concurrent.TimeUnit;
913

10-
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
14+
import static java.lang.String.format;
1115
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
1216

1317
/**
@@ -20,12 +24,24 @@ protected void doSimpleWebdriverTest(BrowserWebDriverContainer rule) {
2024
System.out.println("Selenium remote URL is: " + rule.getSeleniumAddress());
2125
System.out.println("VNC URL is: " + rule.getVncAddress());
2226

23-
//Runtime.getRuntime().exec("open " + rule.getVncUrl(driver)); // For debugging, on a Mac
24-
2527
driver.get("http://www.google.com");
26-
driver.findElement(By.name("q")).sendKeys("testcontainers");
27-
driver.findElement(By.name("q")).submit();
28-
assertEquals("the word 'testcontainers' appears in the search box", "testcontainers", driver.findElement(By.name("q")).getAttribute("value"));
28+
WebElement search = driver.findElement(By.name("q"));
29+
search.sendKeys("testcontainers");
30+
search.submit();
31+
32+
List<WebElement> results = new WebDriverWait(driver, 15)
33+
.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("#search h3")));
34+
35+
assertTrue("the word 'testcontainers' appears in search results",
36+
results.stream()
37+
.anyMatch(el -> el.getText().contains("testcontainers")));
38+
}
39+
40+
protected void assertBrowserNameIs(BrowserWebDriverContainer rule, String expectedName) {
41+
RemoteWebDriver driver = setupDriverFromRule(rule);
42+
String actual = driver.getCapabilities().getBrowserName();
43+
assertTrue(format("actual browser name is %s", actual),
44+
actual.equals(expectedName));
2945
}
3046

3147
@NotNull

modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import org.junit.Test;
55
import org.junit.experimental.runners.Enclosed;
66
import org.junit.runner.RunWith;
7-
import org.openqa.selenium.remote.DesiredCapabilities;
7+
import org.openqa.selenium.chrome.ChromeOptions;
88
import org.testcontainers.containers.BrowserWebDriverContainer;
99
import org.testcontainers.containers.DefaultRecordingFileFactory;
1010

@@ -19,7 +19,7 @@ public static class ChromeThatRecordsAllTests {
1919

2020
@Rule
2121
public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer()
22-
.withDesiredCapabilities(DesiredCapabilities.chrome())
22+
.withCapabilities(new ChromeOptions())
2323
.withRecordingMode(RECORD_ALL, new File("./build/"))
2424
.withRecordingFileFactory(new DefaultRecordingFileFactory());
2525

@@ -33,7 +33,7 @@ public static class ChromeThatRecordsFailingTests {
3333

3434
@Rule
3535
public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer()
36-
.withDesiredCapabilities(DesiredCapabilities.chrome());
36+
.withCapabilities(new ChromeOptions());
3737

3838
@Test
3939
public void recordingTestThatShouldBeRecordedButDeleted() {
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
11
package org.testcontainers.junit;
22

3+
import org.junit.Before;
34
import org.junit.Rule;
45
import org.junit.Test;
5-
import org.openqa.selenium.remote.DesiredCapabilities;
6+
import org.openqa.selenium.chrome.ChromeOptions;
67
import org.testcontainers.containers.BrowserWebDriverContainer;
78

8-
import java.io.IOException;
9-
109
/**
1110
*
1211
*/
1312
public class ChromeWebDriverContainerTest extends BaseWebDriverContainerTest {
1413

1514
@Rule
1615
public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer()
17-
.withDesiredCapabilities(DesiredCapabilities.chrome());
16+
.withCapabilities(new ChromeOptions());
17+
18+
@Before
19+
public void checkBrowserIsIndeedChrome() {
20+
assertBrowserNameIs(chrome, "chrome");
21+
}
1822

1923
@Test
20-
public void simpleTest() throws IOException {
24+
public void simpleTest() {
2125
doSimpleWebdriverTest(chrome);
2226
}
2327

2428
@Test
25-
public void simpleExploreTest() throws IOException {
29+
public void simpleExploreTest() {
2630
doSimpleExplore(chrome);
2731
}
2832
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.testcontainers.junit;
2+
3+
import org.junit.Rule;
4+
import org.junit.Test;
5+
import org.testcontainers.containers.BrowserWebDriverContainer;
6+
7+
public class ContainerWithoutCapabilitiesTest extends BaseWebDriverContainerTest{
8+
9+
@Rule
10+
public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer();
11+
12+
@Test
13+
public void chromeIsStartedIfNoCapabilitiesProvided() {
14+
assertBrowserNameIs(chrome, "chrome");
15+
}
16+
17+
@Test
18+
public void simpleExploreTestWhenNoCapabilitiesProvided(){
19+
doSimpleExplore(chrome);
20+
}
21+
}

modules/selenium/src/test/java/org/testcontainers/junit/CustomWaitTimeoutWebDriverContainerTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
import org.junit.Rule;
44
import org.junit.Test;
5-
import org.openqa.selenium.remote.DesiredCapabilities;
5+
import org.openqa.selenium.chrome.ChromeOptions;
66
import org.testcontainers.containers.BrowserWebDriverContainer;
77

8-
import java.io.IOException;
98
import java.time.Duration;
109

1110
import static java.time.temporal.ChronoUnit.SECONDS;
@@ -17,11 +16,11 @@ public class CustomWaitTimeoutWebDriverContainerTest extends BaseWebDriverContai
1716

1817
@Rule
1918
public BrowserWebDriverContainer chromeWithCustomTimeout = new BrowserWebDriverContainer<>()
20-
.withDesiredCapabilities(DesiredCapabilities.chrome())
19+
.withCapabilities(new ChromeOptions())
2120
.withStartupTimeout(Duration.of(30, SECONDS));
2221

2322
@Test
24-
public void simpleTest() throws IOException {
23+
public void simpleTest() {
2524
doSimpleWebdriverTest(chromeWithCustomTimeout);
2625
}
2726
}

0 commit comments

Comments
 (0)