Skip to content

Commit

Permalink
Merge pull request #611 from ostap-oleksyn/selenium-3.6
Browse files Browse the repository at this point in the history
Update the project to selenium 3.6.0
  • Loading branch information
asolntsev committed Oct 7, 2017
2 parents 0b82a1c + e2b6820 commit 0f2e450
Show file tree
Hide file tree
Showing 13 changed files with 101 additions and 108 deletions.
6 changes: 3 additions & 3 deletions build.gradle
Expand Up @@ -40,7 +40,7 @@ configurations {
dependencies {
compile group: 'io.github.bonigarcia', name: 'webdrivermanager', version: '1.7.2'
compile('org.apache.httpcomponents:httpcore:4.4.7')
compile('org.seleniumhq.selenium:selenium-java:3.5.3') {
compile('org.seleniumhq.selenium:selenium-java:3.6.0') {
exclude group: 'org.seleniumhq.selenium', module: 'selenium-android-driver'
exclude group: 'org.seleniumhq.selenium', module: 'selenium-iphone-driver'
exclude group: 'org.seleniumhq.selenium', module: 'selenium-safari-driver'
Expand All @@ -58,15 +58,15 @@ dependencies {
compile 'com.google.guava:guava:23.0'
runtime 'commons-codec:commons-codec:1.10'
provided group: 'org.seleniumhq.selenium', name: 'htmlunit-driver', version: '2.27', transitive: false
provided group: 'net.sourceforge.htmlunit', name: 'htmlunit', version: '2.27', transitive: false
provided group: 'net.sourceforge.htmlunit', name: 'htmlunit', version: '2.27'
testRuntime group: 'net.sourceforge.htmlunit', name: 'htmlunit', version: '2.27', transitive: false
compile('net.lightbody.bmp:browsermob-core:2.1.5')
testRuntime group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25', transitive: false

provided 'junit:junit:4.12'
provided 'org.testng:testng:6.9.10'

testCompile group: 'org.seleniumhq.selenium', name: 'selenium-server', version: '3.5.3', transitive: false
testCompile group: 'org.seleniumhq.selenium', name: 'selenium-server', version: '3.6.0', transitive: false
testCompile 'org.mockito:mockito-core:2.10.0'
testCompile 'org.seleniumhq.selenium:jetty-repacked:9.4.5.v20170502'
testCompile 'org.eclipse.jetty:jetty-server:9.4.5.v20170502'
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/com/codeborne/selenide/Configuration.java
Expand Up @@ -358,5 +358,11 @@ public enum FileDownloadMode {
*/
public static boolean driverManagerEnabled = Boolean.parseBoolean(System.getProperty("selenide.driverManagerEnabled", "true"));


/**
* Enables the ability to run the browser in headless mode.
* Works only for Chrome(59+) and Firefox(56+).
*
* Default: false
*/
public static boolean headless = Boolean.parseBoolean(System.getProperty("selenide.headless", "false"));
}
2 changes: 1 addition & 1 deletion src/main/java/com/codeborne/selenide/SelenideElement.java
Expand Up @@ -15,7 +15,7 @@
*/
public interface SelenideElement extends WebElement, FindsByLinkText, FindsById, FindsByName,
FindsByTagName, FindsByClassName, FindsByCssSelector,
FindsByXPath, WrapsDriver, WrapsElement, Locatable {
FindsByXPath, WrapsDriver, WrapsElement, org.openqa.selenium.interactions.internal.Locatable {

/**
* <p>
Expand Down
Expand Up @@ -4,7 +4,6 @@
import com.codeborne.selenide.proxy.SelenideProxyServer;
import com.codeborne.selenide.webdriver.WebDriverFactory;
import org.openqa.selenium.*;
import org.openqa.selenium.internal.Killable;
import org.openqa.selenium.remote.UnreachableBrowserException;
import org.openqa.selenium.support.events.EventFiringWebDriver;
import org.openqa.selenium.support.events.WebDriverEventListener;
Expand All @@ -23,7 +22,6 @@
import static com.codeborne.selenide.impl.Describe.describe;
import static java.lang.Thread.currentThread;
import static java.util.logging.Level.FINE;
import static java.util.logging.Level.SEVERE;

public class WebDriverThreadLocalContainer implements WebDriverContainer {
private static final Logger log = Logger.getLogger(WebDriverThreadLocalContainer.class.getName());
Expand Down Expand Up @@ -127,7 +125,7 @@ protected void closeWebDriver(Thread thread) {
ALL_WEB_DRIVERS_THREADS.remove(thread);
WebDriver webdriver = THREAD_WEB_DRIVER.remove(thread.getId());
SelenideProxyServer proxy = THREAD_PROXY_SERVER.remove(thread.getId());

if (webdriver != null && !holdBrowserOpen) {
log.info("Close webdriver: " + thread.getId() + " -> " + webdriver);
if (proxy != null) {
Expand Down Expand Up @@ -185,25 +183,12 @@ public void run() {
catch (WebDriverException cannotCloseBrowser) {
log.severe("Cannot close browser normally: " + Cleanup.of.webdriverExceptionMessage(cannotCloseBrowser));
}
finally {
killBrowser(webdriver);
}


if (proxy != null) {
log.info("Trying to shutdown " + proxy + " ...");
proxy.shutdown();
}
}

protected void killBrowser(WebDriver webdriver) {
if (webdriver instanceof Killable) {
try {
((Killable) webdriver).kill();
} catch (Exception e) {
log.log(SEVERE, "Failed to kill browser " + webdriver + ':', e);
}
}
}
}

@Override
Expand Down Expand Up @@ -231,7 +216,7 @@ public String getCurrentFrameUrl() {

protected WebDriver createDriver() {
Proxy userProvidedProxy = proxy;

if (Configuration.fileDownload == PROXY) {
SelenideProxyServer selenideProxyServer = new SelenideProxyServer(proxy);
selenideProxyServer.start();
Expand All @@ -242,7 +227,7 @@ protected WebDriver createDriver() {
WebDriver webdriver = factory.createWebDriver(userProvidedProxy);

log.info("Create webdriver in current thread " + currentThread().getId() + ": " +
describe(webdriver) + " -> " + webdriver);
describe(webdriver) + " -> " + webdriver);

return markForAutoClose(addListeners(webdriver));
}
Expand Down
@@ -1,23 +1,20 @@
package com.codeborne.selenide.webdriver;

import static com.codeborne.selenide.Configuration.browserVersion;
import static com.codeborne.selenide.Configuration.pageLoadStrategy;
import static com.codeborne.selenide.WebDriverRunner.isPhantomjs;
import static org.openqa.selenium.remote.CapabilityType.ACCEPT_SSL_CERTS;
import static org.openqa.selenium.remote.CapabilityType.PROXY;
import static org.openqa.selenium.remote.CapabilityType.SUPPORTS_ALERTS;
import static org.openqa.selenium.remote.CapabilityType.TAKES_SCREENSHOT;

import com.codeborne.selenide.WebDriverProvider;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Logger;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Logger;

import static com.codeborne.selenide.Configuration.browserVersion;
import static com.codeborne.selenide.Configuration.pageLoadStrategy;
import static com.codeborne.selenide.WebDriverRunner.isPhantomjs;
import static org.openqa.selenium.remote.CapabilityType.*;

abstract class AbstractDriverFactory {

private static final Logger log = Logger.getLogger(AbstractDriverFactory.class.getName());
Expand All @@ -31,7 +28,6 @@ WebDriver createInstanceOf(final String className, final Proxy proxy) {
DesiredCapabilities capabilities = createCommonCapabilities(proxy);
capabilities.setJavascriptEnabled(true);
capabilities.setCapability(TAKES_SCREENSHOT, true);
capabilities.setCapability(ACCEPT_SSL_CERTS, true);
capabilities.setCapability(SUPPORTS_ALERTS, true);
if (isPhantomjs()) {
capabilities.setCapability("phantomjs.cli.args", // PhantomJSDriverService.PHANTOMJS_CLI_ARGS == "phantomjs.cli.args"
Expand Down Expand Up @@ -66,14 +62,15 @@ DesiredCapabilities createCommonCapabilities(final Proxy proxy) {
if (browserVersion != null && !browserVersion.isEmpty()) {
browserCapabilities.setVersion(browserVersion);
}
browserCapabilities.setCapability(CapabilityType.PAGE_LOAD_STRATEGY, pageLoadStrategy);
browserCapabilities.setCapability("acceptSslCerts", true);
browserCapabilities.setCapability(PAGE_LOAD_STRATEGY, pageLoadStrategy);
browserCapabilities.setCapability(ACCEPT_SSL_CERTS, true);

browserCapabilities = transferCapabilitiesFromSystemProperties(browserCapabilities, "capabilities.");
transferCapabilitiesFromSystemProperties(browserCapabilities);
return browserCapabilities;
}

private DesiredCapabilities transferCapabilitiesFromSystemProperties(DesiredCapabilities currentBrowserCapabilities, String prefix) {
private void transferCapabilitiesFromSystemProperties(DesiredCapabilities currentBrowserCapabilities) {
String prefix = "capabilities.";
for (String key : System.getProperties().stringPropertyNames()) {
if (key.startsWith(prefix)) {
String capability = key.substring(prefix.length());
Expand All @@ -88,6 +85,5 @@ private DesiredCapabilities transferCapabilitiesFromSystemProperties(DesiredCapa
}
}
}
return currentBrowserCapabilities;
}
}
Expand Up @@ -4,57 +4,49 @@
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Logger;

import static com.codeborne.selenide.Configuration.browser;
import static com.codeborne.selenide.Configuration.chromeSwitches;
import static com.codeborne.selenide.Configuration.*;
import static com.codeborne.selenide.WebDriverRunner.CHROME;

class ChromeDriverFactory extends AbstractDriverFactory {

private static final Logger log = Logger.getLogger(ChromeDriverFactory.class.getName());

WebDriver create(final Proxy proxy) {
DesiredCapabilities capabilities = createCommonCapabilities(proxy);
ChromeOptions options = createChromeOptions();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
return new ChromeDriver(capabilities);
ChromeOptions options = createChromeOptions(proxy);
return new ChromeDriver(options);
}

@Override
boolean supports() {
return CHROME.equalsIgnoreCase(browser);
}

ChromeOptions createChromeOptions() {
ChromeOptions createChromeOptions(Proxy proxy) {
ChromeOptions options = new ChromeOptions();
options.setHeadless(headless);
options.addArguments("--no-sandbox"); // This make Chromium reachable (?)
if (chromeSwitches != null) {
options.addArguments(chromeSwitches);
}
options = transferChromeOptionsFromSystemProperties(options, "chromeoptions.");
try {
log.config("Chrome options:" + options.toJson().toString());
} catch (IOException e) {
log.warning("Error while reading from file:" + e.getMessage() + ". Ignoring it.");
e.printStackTrace(System.err);
}
options.merge(createCommonCapabilities(proxy));
options = transferChromeOptionsFromSystemProperties(options);
log.config("Chrome options:" + options.toString());
return options;
}

/**
* This method only handles so-called "arguments" for ChromeOptions (there is also "ExperimentalOptions", "Extensions" etc.)
*
* @param currentChromeOptions
* @param prefix
* @return
*/
private ChromeOptions transferChromeOptionsFromSystemProperties(final ChromeOptions currentChromeOptions, final String prefix) {
private ChromeOptions transferChromeOptionsFromSystemProperties(ChromeOptions currentChromeOptions) {
String prefix = "chromeoptions.";
for (String key : System.getProperties().stringPropertyNames()) {
if (key.startsWith(prefix)) {
String capability = key.substring(prefix.length());
Expand Down
Expand Up @@ -3,23 +3,26 @@
import com.codeborne.selenide.WebDriverRunner;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;

class EdgeDriverFactory extends AbstractDriverFactory {

@Override
WebDriver create(final Proxy proxy) {
return createInternetExplorerDriver(proxy);
return createEdgeDriver(proxy);
}

@Override
boolean supports() {
return WebDriverRunner.isEdge();
}

private WebDriver createInternetExplorerDriver(final Proxy proxy) {
private WebDriver createEdgeDriver(final Proxy proxy) {
DesiredCapabilities capabilities = createCommonCapabilities(proxy);
return new InternetExplorerDriver(capabilities);
EdgeOptions options = new EdgeOptions();
options.merge(capabilities);
return new EdgeDriver(options);
}
}
Expand Up @@ -4,11 +4,13 @@
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.util.logging.Logger;

import static com.codeborne.selenide.Configuration.headless;

class FirefoxDriverFactory extends AbstractDriverFactory {

private static final Logger log = Logger.getLogger(FirefoxDriverFactory.class.getName());
Expand All @@ -24,43 +26,46 @@ WebDriver create(final Proxy proxy) {
}

private WebDriver createFirefoxDriver(final Proxy proxy) {
DesiredCapabilities capabilities = createFirefoxCapabilities(proxy);
FirefoxOptions options = createFirefoxOptions(proxy);
log.info("Firefox 48+ is currently not supported by Selenium Firefox driver. " +
"Use browser=marionette with geckodriver, when using it.");
return new FirefoxDriver(capabilities);
return new FirefoxDriver(options);
}

DesiredCapabilities createFirefoxCapabilities(Proxy proxy) {
FirefoxProfile myProfile = new FirefoxProfile();
myProfile.setPreference("network.automatic-ntlm-auth.trusted-uris", "http://,https://");
myProfile.setPreference("network.automatic-ntlm-auth.allow-non-fqdn", true);
myProfile.setPreference("network.negotiate-auth.delegation-uris", "http://,https://");
myProfile.setPreference("network.negotiate-auth.trusted-uris", "http://,https://");
myProfile.setPreference("network.http.phishy-userpass-length", 255);
myProfile.setPreference("security.csp.enable", false);
FirefoxOptions createFirefoxOptions(Proxy proxy) {
FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.setHeadless(headless);
firefoxOptions.addPreference("network.automatic-ntlm-auth.trusted-uris", "http://,https://");
firefoxOptions.addPreference("network.automatic-ntlm-auth.allow-non-fqdn", true);
firefoxOptions.addPreference("network.negotiate-auth.delegation-uris", "http://,https://");
firefoxOptions.addPreference("network.negotiate-auth.trusted-uris", "http://,https://");
firefoxOptions.addPreference("network.http.phishy-userpass-length", 255);
firefoxOptions.addPreference("security.csp.enable", false);

firefoxOptions.setCapability("marionette", false);
firefoxOptions.merge(createCommonCapabilities(proxy));
firefoxOptions = transferFirefoxProfileFromSystemProperties(firefoxOptions);

DesiredCapabilities capabilities = createCommonCapabilities(proxy);
myProfile = transferFirefoxProfileFromSystemProperties(myProfile, "firefoxprofile.");
capabilities.setCapability("marionette", false);
capabilities.setCapability(FirefoxDriver.PROFILE, myProfile);
return capabilities;
return firefoxOptions;
}

private FirefoxProfile transferFirefoxProfileFromSystemProperties(FirefoxProfile currentFirefoxProfile, String prefix) {
private FirefoxOptions transferFirefoxProfileFromSystemProperties(FirefoxOptions currentFirefoxOptions) {
String prefix = "firefoxprofile.";
FirefoxProfile profile = new FirefoxProfile();
for (String key : System.getProperties().stringPropertyNames()) {
if (key.startsWith(prefix)) {
String capability = key.substring(prefix.length());
String value = System.getProperties().getProperty(key);
log.config("Use " + key + "=" + value);
if (value.equals("true") || value.equals("false")) {
currentFirefoxProfile.setPreference(capability, Boolean.valueOf(value));
profile.setPreference(capability, Boolean.valueOf(value));
} else if (value.matches("^-?\\d+$")) { //if integer
currentFirefoxProfile.setPreference(capability, Integer.parseInt(value));
profile.setPreference(capability, Integer.parseInt(value));
} else {
currentFirefoxProfile.setPreference(capability, value);
profile.setPreference(capability, value);
}
}
}
return currentFirefoxProfile;
return currentFirefoxOptions.setProfile(profile);
}
}
Expand Up @@ -4,6 +4,7 @@
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.ie.InternetExplorerOptions;
import org.openqa.selenium.remote.DesiredCapabilities;

class InternetExplorerDriverFactory extends AbstractDriverFactory {
Expand All @@ -20,6 +21,7 @@ WebDriver create(final Proxy proxy) {

private WebDriver createInternetExplorerDriver(final Proxy proxy) {
DesiredCapabilities capabilities = createCommonCapabilities(proxy);
return new InternetExplorerDriver(capabilities);
InternetExplorerOptions options = new InternetExplorerOptions(capabilities);
return new InternetExplorerDriver(options);
}
}

0 comments on commit 0f2e450

Please sign in to comment.