From 758b9d6729b93772213c66c10c1d655838a2b252 Mon Sep 17 00:00:00 2001 From: Andrei Solntsev Date: Tue, 2 Oct 2018 01:21:58 +0300 Subject: [PATCH 1/3] #825 Upgrade to WebDriverManager 3.0.0 (again) --- CHANGELOG.md | 1 + build.gradle | 2 +- gradle/dependencies.gradle | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d996d09be4..cbd9d7887c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * #810 set browser size to 1366x768 by default -- thanks to @rosolko for PR #812 * #806 Remove deprecated APIs -- thanks to @rosolko for PR #812 * bugfix: method Selenide.download() should not fail if there is no opened browser yet +* #825 Upgrade to WebDriverManager 3.0.0 (again) Technical changes (probably should not affect end users): * Move constants IE, FIREFOX etc from class `WebDriverRunner` to its parent class `Browsers` diff --git a/build.gradle b/build.gradle index ea8c93689f..d3ba29ad76 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ plugins { group = 'com.codeborne' archivesBaseName = 'selenide' -version = '5.0.0-rc.1' +version = '5.0.0-SNAPSHOT' ext { encoding = StandardCharsets.UTF_8.name() diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index aa3c71bfa8..80fa82097a 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -12,7 +12,7 @@ ext { dependencies { api("org.seleniumhq.selenium:selenium-java:$seleniumVersion") - api('io.github.bonigarcia:webdrivermanager:2.2.5') + api('io.github.bonigarcia:webdrivermanager:3.0.0') implementation('net.lightbody.bmp:browsermob-core:2.1.5') From 37c68a0a4cd9ed4dca57762b9ebe04efb1c363da Mon Sep 17 00:00:00 2001 From: Andrei Solntsev Date: Tue, 2 Oct 2018 01:24:38 +0300 Subject: [PATCH 2/3] #825 Add workaround for WebDriverManager issue ... when it calls github too often and gets 403 error --- CHANGELOG.md | 1 + .../webdriver/WebDriverBinaryManager.java | 73 +++++++++++++++---- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbd9d7887c..37869682c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * #806 Remove deprecated APIs -- thanks to @rosolko for PR #812 * bugfix: method Selenide.download() should not fail if there is no opened browser yet * #825 Upgrade to WebDriverManager 3.0.0 (again) +* #825 Add workaround for WebDriverManager issue when it calls github too often and gets 403 error Technical changes (probably should not affect end users): * Move constants IE, FIREFOX etc from class `WebDriverRunner` to its parent class `Browsers` diff --git a/src/main/java/com/codeborne/selenide/webdriver/WebDriverBinaryManager.java b/src/main/java/com/codeborne/selenide/webdriver/WebDriverBinaryManager.java index 2bc7b64e27..4001cf99ec 100644 --- a/src/main/java/com/codeborne/selenide/webdriver/WebDriverBinaryManager.java +++ b/src/main/java/com/codeborne/selenide/webdriver/WebDriverBinaryManager.java @@ -3,6 +3,11 @@ import com.codeborne.selenide.Browser; import io.github.bonigarcia.wdm.WebDriverManager; +import java.io.File; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import static io.github.bonigarcia.wdm.WebDriverManager.config; import static org.apache.commons.lang3.StringUtils.isNotBlank; public class WebDriverBinaryManager { @@ -16,42 +21,84 @@ public void setupBinaryPath(Browser browser) { } private void setupChrome() { - if (!isSystemPropertySet("webdriver.chrome.driver")) { + cacheMeIfYouCan("webdriver.chrome.driver", () -> { WebDriverManager.chromedriver().setup(); - } + }); } private void setupEdge() { - if (!isSystemPropertySet("webdriver.edge.driver")) { + cacheMeIfYouCan("webdriver.edge.driver", () -> { WebDriverManager.edgedriver().setup(); - } + }); } private void setupIE() { - if (!isSystemPropertySet("webdriver.ie.driver")) { + cacheMeIfYouCan("webdriver.ie.driver", () -> { WebDriverManager.iedriver().setup(); - } + }); } private void setupOpera() { - if (!isSystemPropertySet("webdriver.opera.driver")) { + cacheMeIfYouCan("webdriver.opera.driver", () -> { WebDriverManager.operadriver().setup(); - } + }); } private void setupPhantomjs() { - if (!isSystemPropertySet("phantomjs.binary.path")) { + cacheMeIfYouCan("phantomjs.binary.path", () -> { WebDriverManager.phantomjs().setup(); - } + }); } private void setupFirefox() { - if (!isSystemPropertySet("webdriver.gecko.driver")) { + cacheMeIfYouCan("webdriver.gecko.driver", () -> { WebDriverManager.firefoxdriver().setup(); + }); + } + + private void cacheMeIfYouCan(String systemPropertyName, Runnable webdriverSetup) { + if (webdriverIsAlreadyInitialized(systemPropertyName)) { + return; } + + File lastCheckIndicator = new File(config().getTargetPath(), lastModifiedFileName(systemPropertyName)); + boolean canUseCachedWebdriver = lastCheckIndicator.exists() && hasRecentlyCheckedForUpdates(lastCheckIndicator); + if (canUseCachedWebdriver) { + config().setForceCache(true); + } + + webdriverSetup.run(); + + if (!canUseCachedWebdriver) { + markAsRecentlyChecked(lastCheckIndicator); + } + } + + private boolean webdriverIsAlreadyInitialized(String systemPropertyName) { + return isNotBlank(System.getProperty(systemPropertyName, "")); + } + + private String lastModifiedFileName(String systemPropertyName) { + return systemPropertyName + '.' + config().getOs().toLowerCase() + config().getArchitecture() + ".timestamp"; + } + + private boolean hasRecentlyCheckedForUpdates(File lastCheckIndicator) { + return System.currentTimeMillis() - lastCheckIndicator.lastModified() < TimeUnit.HOURS.toMillis(4); } - private boolean isSystemPropertySet(String key) { - return isNotBlank(System.getProperty(key, "")); + private void markAsRecentlyChecked(File lastCheckIndicator) { + if (!lastCheckIndicator.exists()) { + try { + if (!lastCheckIndicator.createNewFile()) { + throw new RuntimeException("Failed to create " + lastCheckIndicator.getAbsolutePath()); + } + } + catch (IOException e) { + throw new RuntimeException("Failed to create " + lastCheckIndicator.getAbsolutePath(), e); + } + } + else if (!lastCheckIndicator.setLastModified(System.currentTimeMillis())) { + throw new RuntimeException("Failed to touch " + lastCheckIndicator.getAbsolutePath()); + } } } From cc9d9f3b391c0e03cc4874c9199c0d113e60300a Mon Sep 17 00:00:00 2001 From: Andrei Solntsev Date: Tue, 2 Oct 2018 08:35:43 +0300 Subject: [PATCH 3/3] #825 add debug logs --- .../webdriver/WebDriverBinaryManager.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/com/codeborne/selenide/webdriver/WebDriverBinaryManager.java b/src/main/java/com/codeborne/selenide/webdriver/WebDriverBinaryManager.java index 4001cf99ec..6e4841973f 100644 --- a/src/main/java/com/codeborne/selenide/webdriver/WebDriverBinaryManager.java +++ b/src/main/java/com/codeborne/selenide/webdriver/WebDriverBinaryManager.java @@ -5,12 +5,16 @@ import java.io.File; import java.io.IOException; +import java.util.Date; import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; import static io.github.bonigarcia.wdm.WebDriverManager.config; import static org.apache.commons.lang3.StringUtils.isNotBlank; public class WebDriverBinaryManager { + private static final Logger log = Logger.getLogger(WebDriverBinaryManager.class.getName()); + public void setupBinaryPath(Browser browser) { if (browser.isChrome()) setupChrome(); if (browser.isEdge()) setupEdge(); @@ -58,20 +62,35 @@ private void setupFirefox() { private void cacheMeIfYouCan(String systemPropertyName, Runnable webdriverSetup) { if (webdriverIsAlreadyInitialized(systemPropertyName)) { + log.info("Skip: webdriver is already initialized: " + System.getProperty(systemPropertyName)); return; } File lastCheckIndicator = new File(config().getTargetPath(), lastModifiedFileName(systemPropertyName)); boolean canUseCachedWebdriver = lastCheckIndicator.exists() && hasRecentlyCheckedForUpdates(lastCheckIndicator); + log.info("lastCheckIndicator=" + lastCheckIndicator.getAbsolutePath() + + ", exists=" + lastCheckIndicator.exists() + ", lastModified=" + new Date(lastCheckIndicator.lastModified()) + + ", now=" + new Date() + ", diff: " + (System.currentTimeMillis() - lastCheckIndicator.lastModified()) + " ms."); + if (canUseCachedWebdriver) { + log.info("Can use cache"); config().setForceCache(true); } + else { + log.info("Cannot use cache"); + } webdriverSetup.run(); if (!canUseCachedWebdriver) { + long ts = System.currentTimeMillis(); + log.info("Mark as recently checked: " + lastCheckIndicator.getAbsolutePath() + ", ts=" + ts + ", now=" + new Date(ts)); markAsRecentlyChecked(lastCheckIndicator); } + else { + long ts = System.currentTimeMillis(); + log.info("Not marking as recently checked: " + lastCheckIndicator.getAbsolutePath() + ", ts=" + ts + ", now=" + new Date(ts)); + } } private boolean webdriverIsAlreadyInitialized(String systemPropertyName) {