From 4fcc24edca8c5a90da9e7058ee13ea0025aa5f04 Mon Sep 17 00:00:00 2001 From: Anna Chernyshova Date: Thu, 6 Jan 2022 15:19:38 +0300 Subject: [PATCH 1/7] Option to fix #4593 in the context of #4609 --- .../containers/BrowserWebDriverContainer.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index 7bc37e4701c..2615b5ae0ee 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -166,13 +166,6 @@ protected void configure() { } } - // Hack for new selenium-chrome image that contains Chrome 92. - // If not disabled, container startup will fail in most cases and consume excessive amounts of CPU. - if (capabilities instanceof ChromeOptions) { - ChromeOptions options = (ChromeOptions) this.capabilities; - options.addArguments("--disable-gpu"); - } - if (recordingMode != VncRecordingMode.SKIP) { if (vncRecordingDirectory == null) { From 5ceaac7cf8495b8b4e5dcb3fd5e851b063fdddbf Mon Sep 17 00:00:00 2001 From: Anna Chernyshova Date: Tue, 11 Jan 2022 19:56:41 +0300 Subject: [PATCH 2/7] Deleted RemoteWebDriver creation from containerIsStarted --- .../containers/BrowserWebDriverContainer.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index 2615b5ae0ee..8682efa7609 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -156,16 +156,6 @@ protected void configure() { String seleniumVersion = SeleniumUtils.determineClasspathSeleniumVersion(); - if (capabilities == null) { - if (seleniumVersion.startsWith("2.")) { - logger().info("No capabilities provided, falling back to DesiredCapabilities.chrome()"); - capabilities = DesiredCapabilities.chrome(); - } else { - logger().info("No capabilities provided, falling back to ChromeOptions"); - capabilities = new ChromeOptions(); - } - } - if (recordingMode != VncRecordingMode.SKIP) { if (vncRecordingDirectory == null) { @@ -273,10 +263,6 @@ public int getPort() { @Override protected void containerIsStarted(InspectContainerResponse containerInfo) { - driver = Unreliables.retryUntilSuccess(30, TimeUnit.SECONDS, - () -> Timeouts.getWithTimeout(10, TimeUnit.SECONDS, - () -> new RemoteWebDriver(getSeleniumAddress(), capabilities))); - if (vncRecordingContainer != null) { LOGGER.debug("Starting VNC recording"); vncRecordingContainer.start(); From 0d74044e11a6adb4a05ac9d1fd883926d8dcc8c5 Mon Sep 17 00:00:00 2001 From: Anna Chernyshova Date: Wed, 12 Jan 2022 14:22:44 +0300 Subject: [PATCH 3/7] Added RemoteWebDriver creation to getWebDriver() method --- .../containers/BrowserWebDriverContainer.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index 8682efa7609..7a2c7ec7292 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -278,6 +278,16 @@ protected void containerIsStarted(InspectContainerResponse containerInfo) { * @return a new Remote Web Driver instance */ public RemoteWebDriver getWebDriver() { + if (driver == null) { + if (capabilities == null) { + logger().warn("No capabilities provided - this will cause an exception in future versions. Falling back to ChromeOptions"); + capabilities = new ChromeOptions(); + } + + driver = Unreliables.retryUntilSuccess(30, TimeUnit.SECONDS, + () -> Timeouts.getWithTimeout(10, TimeUnit.SECONDS, + () -> new RemoteWebDriver(getSeleniumAddress(), capabilities))); + } return driver; } From 5c8df20da52dc3160b885e3b51e46a9622975b76 Mon Sep 17 00:00:00 2001 From: Anna Chernyshova Date: Wed, 12 Jan 2022 15:24:21 +0300 Subject: [PATCH 4/7] Updated default DockerImage strategy --- .../containers/BrowserWebDriverContainer.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index 7a2c7ec7292..234ce65c644 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -35,6 +35,7 @@ import org.testcontainers.containers.wait.strategy.WaitStrategy; import org.testcontainers.lifecycle.TestDescription; import org.testcontainers.lifecycle.TestLifecycleAware; +import org.testcontainers.utility.ComparableVersion; import org.testcontainers.utility.DockerImageName; /** @@ -44,13 +45,15 @@ */ public class BrowserWebDriverContainer> extends GenericContainer implements LinkableContainer, TestLifecycleAware { - private static final DockerImageName CHROME_IMAGE = DockerImageName.parse("selenium/standalone-chrome-debug"); - private static final DockerImageName FIREFOX_IMAGE = DockerImageName.parse("selenium/standalone-firefox-debug"); + private static final DockerImageName CHROME_IMAGE = DockerImageName.parse("selenium/standalone-chrome"); + private static final DockerImageName FIREFOX_IMAGE = DockerImageName.parse("selenium/standalone-firefox"); + private static final DockerImageName CHROME_DEBUG_IMAGE = DockerImageName.parse("selenium/standalone-chrome-debug"); + private static final DockerImageName FIREFOX_DEBUG_IMAGE = DockerImageName.parse("selenium/standalone-firefox-debug"); private static final DockerImageName[] COMPATIBLE_IMAGES = new DockerImageName[] { CHROME_IMAGE, FIREFOX_IMAGE, - DockerImageName.parse("selenium/standalone-chrome"), - DockerImageName.parse("selenium/standalone-firefox") + CHROME_DEBUG_IMAGE, + FIREFOX_DEBUG_IMAGE }; private static final String DEFAULT_PASSWORD = "secret"; @@ -227,12 +230,14 @@ public static String getDockerImageForCapabilities(Capabilities capabilities, St } private static DockerImageName getStandardImageForCapabilities(Capabilities capabilities, String seleniumVersion) { - String browserName = capabilities.getBrowserName(); + String browserName = capabilities == null ? BrowserType.CHROME : capabilities.getBrowserName(); + + boolean seleniumGreaterOrEqualTo4 = new ComparableVersion(seleniumVersion).isGreaterThanOrEqualTo("4"); switch (browserName) { case BrowserType.CHROME: - return CHROME_IMAGE.withTag(seleniumVersion); + return (seleniumGreaterOrEqualTo4 ? CHROME_IMAGE : CHROME_DEBUG_IMAGE).withTag(seleniumVersion); case BrowserType.FIREFOX: - return FIREFOX_IMAGE.withTag(seleniumVersion); + return (seleniumGreaterOrEqualTo4 ? FIREFOX_IMAGE : FIREFOX_DEBUG_IMAGE).withTag(seleniumVersion); default: throw new UnsupportedOperationException("Browser name must be 'chrome' or 'firefox'; provided '" + browserName + "' is not supported"); } From cb1432e9a8935cc2635ad14337a2c238625cb1ae Mon Sep 17 00:00:00 2001 From: Anna Chernyshova Date: Wed, 12 Jan 2022 15:28:12 +0300 Subject: [PATCH 5/7] Updated lambdas and added synchronized to getWebDriver --- .../containers/BrowserWebDriverContainer.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index 234ce65c644..c072461ba98 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -282,16 +282,18 @@ protected void containerIsStarted(InspectContainerResponse containerInfo) { * * @return a new Remote Web Driver instance */ - public RemoteWebDriver getWebDriver() { + public synchronized RemoteWebDriver getWebDriver() { if (driver == null) { if (capabilities == null) { logger().warn("No capabilities provided - this will cause an exception in future versions. Falling back to ChromeOptions"); capabilities = new ChromeOptions(); } - driver = Unreliables.retryUntilSuccess(30, TimeUnit.SECONDS, - () -> Timeouts.getWithTimeout(10, TimeUnit.SECONDS, - () -> new RemoteWebDriver(getSeleniumAddress(), capabilities))); + driver = Unreliables.retryUntilSuccess(30, TimeUnit.SECONDS, () -> { + return Timeouts.getWithTimeout(10, TimeUnit.SECONDS, () -> { + return new RemoteWebDriver(getSeleniumAddress(), capabilities); + }); + }); } return driver; } From 68d530ad1ec3cace8b5abd241a555419d4b2850f Mon Sep 17 00:00:00 2001 From: Anna Chernyshova Date: Thu, 13 Jan 2022 11:05:31 +0300 Subject: [PATCH 6/7] Removed statement of Selenium 2 support in docs --- docs/modules/webdriver_containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/webdriver_containers.md b/docs/modules/webdriver_containers.md index 34d3430830c..3c6b0ffae27 100644 --- a/docs/modules/webdriver_containers.md +++ b/docs/modules/webdriver_containers.md @@ -5,7 +5,7 @@ from SeleniumHQ's [docker-selenium](https://github.com/SeleniumHQ/docker-seleniu ## Benefits -* Fully compatible with Selenium 2/Webdriver tests, by providing a `RemoteWebDriver` instance +* Fully compatible with Selenium 3 & 4 tests, by providing a `RemoteWebDriver` instance * No need to have specific web browsers, or even a desktop environment, installed on test servers. The only dependency is a working Docker installation and your Java JUnit test suite. * Browsers are always launched from a fixed, clean image. This means no configuration drift from user changes or From 94fce7351e13c0c152b67465fa0c44f02fb9d6be Mon Sep 17 00:00:00 2001 From: Anna Chernyshova Date: Thu, 13 Jan 2022 11:13:24 +0300 Subject: [PATCH 7/7] Renamed variables in getStandardImageForCapabilities --- .../containers/BrowserWebDriverContainer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index c072461ba98..bd38dead8ac 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -231,13 +231,13 @@ public static String getDockerImageForCapabilities(Capabilities capabilities, St private static DockerImageName getStandardImageForCapabilities(Capabilities capabilities, String seleniumVersion) { String browserName = capabilities == null ? BrowserType.CHROME : capabilities.getBrowserName(); + boolean supportsVncWithoutDebugImage = new ComparableVersion(seleniumVersion).isGreaterThanOrEqualTo("4"); - boolean seleniumGreaterOrEqualTo4 = new ComparableVersion(seleniumVersion).isGreaterThanOrEqualTo("4"); switch (browserName) { case BrowserType.CHROME: - return (seleniumGreaterOrEqualTo4 ? CHROME_IMAGE : CHROME_DEBUG_IMAGE).withTag(seleniumVersion); + return (supportsVncWithoutDebugImage ? CHROME_IMAGE : CHROME_DEBUG_IMAGE).withTag(seleniumVersion); case BrowserType.FIREFOX: - return (seleniumGreaterOrEqualTo4 ? FIREFOX_IMAGE : FIREFOX_DEBUG_IMAGE).withTag(seleniumVersion); + return (supportsVncWithoutDebugImage ? FIREFOX_IMAGE : FIREFOX_DEBUG_IMAGE).withTag(seleniumVersion); default: throw new UnsupportedOperationException("Browser name must be 'chrome' or 'firefox'; provided '" + browserName + "' is not supported"); }