diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..7eb59e4d --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,23 @@ +version: 2 + +jobs: + build: + docker: + - image: gradle:jdk8 + steps: + - checkout + - restore_cache: + keys: + - gradle-{{ checksum "build.gradle" }} + - run: + command: ./gradlew check jacocoTestReport && bash <(curl -s https://codecov.io/bash) + - save_cache: + paths: + - ~/.gradle + key: gradle-{{ checksum "build.gradle" }} + - store_artifacts: # for display in Artifacts: https://circleci.com/docs/2.0/artifacts/ + path: build/reports + destination: reports + - store_test_results: # for display in Test Summary: https://circleci.com/docs/2.0/collect-test-data/ + path: build/test-results + # See https://circleci.com/docs/2.0/deployment-integrations/ for deploy examples diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml new file mode 100644 index 00000000..e8c60377 --- /dev/null +++ b/.github/workflows/continuous-integration-workflow.yml @@ -0,0 +1,16 @@ +name: Java CI + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Maven + run: mvn -B package --file pom.xml diff --git a/.travis.yml b/.travis.yml index d2f6617a..3f78ac32 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,8 @@ jdk: before_install: # codacy - https://github.com/codacy/codacy-coverage-reporter#setup - sudo apt-get install jq - - wget -O ~/codacy-coverage-reporter-assembly-latest.jar $(curl https://api.github.com/repos/codacy/codacy-coverage-reporter/releases/latest | jq -r .assets[0].browser_download_url) +# - wget -O ~/codacy-coverage-reporter-assembly-latest.jar $(curl https://api.github.com/repos/codacy/codacy-coverage-reporter/releases/latest | jq -r .assets[0].browser_download_url) + - wget -O ~/codacy-coverage-reporter-assembly-latest.jar https://github.com/codacy/codacy-coverage-reporter/releases/download/4.0.5/codacy-coverage-reporter-4.0.5-assembly.jar script: mvn test -B diff --git a/LICENSE.txt b/LICENSE.txt index 44375bcd..f4b73923 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2013-2016 seleniumQuery authors +Copyright (c) 2013-2020 seleniumQuery authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index fa368efb..e338860d 100644 --- a/README.md +++ b/README.md @@ -2,26 +2,32 @@ [![Maven Central](https://img.shields.io/maven-central/v/io.github.seleniumquery/seleniumquery.svg)](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22io.github.seleniumquery%22%20AND%20a%3A%22seleniumquery%22) + [![codecov.io](https://codecov.io/gh/seleniumQuery/seleniumQuery/branch/master/graph/badge.svg)](https://codecov.io/gh/seleniumQuery/seleniumQuery) -[![Dependency Status](https://www.versioneye.com/user/projects/56861ab2eb4f47003c000e43/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56861ab2eb4f47003c000e43) [![GitHub license](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/seleniumQuery/seleniumQuery/master/LICENSE.txt) [![Join the chat at https://gitter.im/seleniumQuery/seleniumQuery](https://badges.gitter.im/seleniumQuery/seleniumQuery.svg)](https://gitter.im/seleniumQuery/seleniumQuery?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + + + ### Feature-rich jQuery-like Java interface for Selenium WebDriver seleniumQuery is a feature-rich *cross-driver* Java library that brings a **jQuery-like** interface for [Selenium WebDriver](http://docs.seleniumhq.org/projects/webdriver/). -It is designed to be a **thin** layer over Selenium. You can use seleniumQuery to manage the WebDriver for you, or you can use seleniumQuery on top of your favorire selenium framework just +It is designed to be a **thin** layer over Selenium. You can use seleniumQuery to manage the WebDriver for you, or you can use seleniumQuery on top of your favorite selenium framework just to make some cases simpler when needed. ### Example snippet: @@ -134,7 +140,7 @@ To get the latest version of seleniumQuery, add to your **`pom.xml`**: io.github.seleniumquery seleniumquery - 0.18.0 + 0.20.0 ``` @@ -1054,7 +1060,7 @@ $.driver().useInternetExplorer().withPathToIEDriverServerExe("C:\\IEDriverServer ### Available `$("selector").functions()` -Check the [javadocs for our `$().functions`](https://static.javadoc.io/io.github.seleniumquery/seleniumquery/0.18.0/index.html?io/github/seleniumquery/SeleniumQueryObject.html). +Check the [javadocs for our `$().functions`](https://static.javadoc.io/io.github.seleniumquery/seleniumquery/0.19.1/index.html?io/github/seleniumquery/SeleniumQueryObject.html). More info also in our [API wiki page](https://github.com/seleniumQuery/seleniumQuery/wiki/seleniumQuery-API). @@ -1062,7 +1068,7 @@ More info also in our [API wiki page](https://github.com/seleniumQuery/seleniumQ ### Available `$.functions()` -Check the [javadocs for our `$.functions`](https://static.javadoc.io/io.github.seleniumquery/seleniumquery/0.18.0/index.html?io/github/seleniumquery/browser/BrowserFunctions.html). +Check the [javadocs for our `$.functions`](https://static.javadoc.io/io.github.seleniumquery/seleniumquery/0.19.1/index.html?io/github/seleniumquery/browser/BrowserFunctions.html). Read about our global functions in the [API wiki page](https://github.com/seleniumQuery/seleniumQuery/wiki/seleniumQuery-API). @@ -1089,9 +1095,7 @@ Find more about them in [seleniumQuery Selectors wiki page.](https://github.com/ ## seleniumQuery still is Selenium - with "just" a jQuery interface -That's why it can work with disabled JavaScript! - -But there is a more important aspect to it: Although our functions yield the same result as if you were using jQuery, remember we always execute them from the user perspective. +So there is a important aspect of it: Although our functions yield the same result as if you were using jQuery, remember we always execute them from the user perspective. In other words, when you call: ```java $(":input[name='email']").val("seleniumQuery@example.com"); diff --git a/build.gradle b/build.gradle index 5942b3f0..3d160a8d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 seleniumQuery authors + * Copyright (c) 2018 seleniumQuery authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,12 +25,14 @@ idea { } group = 'io.github.seleniumquery' -version = '0.18.0' +version = '0.20.0' description = "seleniumQuery" ext { - seleniumVersion = "3.8.1" + seleniumVersion = '3.141.59' + htmlUnitDriverVersion = '2.33.3' + webDriverManagerVersion = '2.2.5' } sourceCompatibility = 1.8 @@ -46,22 +48,22 @@ repositories { } dependencies { - compile('net.sourceforge.cssparser:cssparser:0.9.24') - compile('org.apache.commons:commons-text:1.1') + compile('net.sourceforge.cssparser:cssparser:0.9.25') + compile('org.apache.commons:commons-text:1.3') compile('org.apache.commons:commons-lang3:3.7') - compile("org.seleniumhq.selenium:htmlunit-driver:2.28.4") + compile("org.seleniumhq.selenium:htmlunit-driver:${htmlUnitDriverVersion}") compile("org.seleniumhq.selenium:selenium-api:${seleniumVersion}") compile("org.seleniumhq.selenium:selenium-java:${seleniumVersion}") compile("org.seleniumhq.selenium:selenium-remote-driver:${seleniumVersion}") - compile("com.codeborne:phantomjsdriver:1.4.3") { + compile("com.codeborne:phantomjsdriver:1.4.4") { exclude(module: 'selenium-java') exclude(module: 'selenium-remote-driver') } compile('commons-logging:commons-logging:1.2') - compile('org.unbescape:unbescape:1.1.5.RELEASE') + compile('org.unbescape:unbescape:1.1.6.RELEASE') // used by driverbuilders in the .autoDriverDownload() methods - compile("io.github.bonigarcia:webdrivermanager:2.0.1") + compile("io.github.bonigarcia:webdrivermanager:${webDriverManagerVersion}") // used by .waitUntil().text().that() compile("org.hamcrest:hamcrest-library:1.3") diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 5e8974a0..00000000 --- a/circle.yml +++ /dev/null @@ -1,7 +0,0 @@ -machine: - services: - - docker -test: - override: - # This one could definitely be a sequence of docker commands to setup a grid - - docker run -it --rm --name seleniumquery-test -v $(pwd):/project -w /project gradle:jdk8 gradle check jacocoTestReport && bash <(curl -s https://codecov.io/bash) diff --git a/doc/IMPORTANT-LIBS.md b/doc/IMPORTANT-LIBS.md new file mode 100644 index 00000000..9bd74919 --- /dev/null +++ b/doc/IMPORTANT-LIBS.md @@ -0,0 +1,17 @@ +# Important libraries + +Check: + + + VERSION IS HERE + +- http://central.maven.org/maven2/org/seleniumhq/selenium/htmlunit-driver/maven-metadata.xml +- http://central.maven.org/maven2/org/seleniumhq/selenium/selenium-java/maven-metadata.xml +- http://central.maven.org/maven2/io/github/bonigarcia/webdrivermanager/maven-metadata.xml + +Others: +- http://central.maven.org/maven2/net/sourceforge/cssparser/cssparser/maven-metadata.xml +- http://central.maven.org/maven2/org/apache/commons/commons-text/maven-metadata.xml +- http://central.maven.org/maven2/org/apache/commons/commons-lang3/maven-metadata.xml +- http://central.maven.org/maven2/com/codeborne/phantomjsdriver/maven-metadata.xml +- http://central.maven.org/maven2/org/unbescape/unbescape/maven-metadata.xml diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml index b829a8c0..01c1bc39 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ @@ -89,7 +90,7 @@ --> com.codeborne phantomjsdriver - 1.4.3 + 1.4.4 org.seleniumhq.selenium @@ -111,14 +112,14 @@ org.unbescape unbescape - 1.1.5.RELEASE + 1.1.6.RELEASE io.github.bonigarcia webdrivermanager - 2.0.1 + ${webdrivermanager.version} @@ -132,7 +133,7 @@ junit junit - 4.12 + 4.13.1 test diff --git a/src/main/java/io/github/seleniumquery/browser/driver/DriverBuilder.java b/src/main/java/io/github/seleniumquery/browser/driver/DriverBuilder.java index 8f4330b7..bc66b2f9 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/DriverBuilder.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/DriverBuilder.java @@ -16,13 +16,12 @@ package io.github.seleniumquery.browser.driver; import java.util.function.Consumer; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; - -import io.github.bonigarcia.wdm.BrowserManager; +import org.openqa.selenium.support.events.EventFiringWebDriver; +import org.openqa.selenium.support.events.WebDriverEventListener; import io.github.bonigarcia.wdm.WebDriverManager; /** @@ -39,10 +38,12 @@ public abstract class DriverBuilder> { private boolean capabilitiesManuallySet = false; - private Consumer autoDriverDownloadConfigurer; + private Consumer autoDriverDownloadConfigurer; private boolean autoQuitAskedFor = false; + private WebDriverEventListener webDriverEventListener; + /** * Configures the driver with the given capabilities. * @param desiredCapabilities The capabilities to be set. @@ -91,9 +92,9 @@ protected boolean isCapabilitiesManuallySet() { protected void autoDownloadDriverIfAskedFor(Class driverClass) { if (this.autoDriverDownloadConfigurer != null) { - BrowserManager browserManager = WebDriverManager.getInstance(driverClass); - this.autoDriverDownloadConfigurer.accept(browserManager); - browserManager.setup(); + WebDriverManager webDriverManager = WebDriverManager.getInstance(driverClass); + this.autoDriverDownloadConfigurer.accept(webDriverManager); + webDriverManager.setup(); } } @@ -110,12 +111,12 @@ public T autoDriverDownload() { /** * Automatically downloads and configures the chromedriver.exe executable using * webdrivermanager. - * @param configurer A function that allows additional configuration of the {@link BrowserManager}. + * @param configurer A function that allows additional configuration of the {@link WebDriverManager}. * @return A self reference, allowing further configuration of the driver builder. * @since 0.18.0 */ @SuppressWarnings("unchecked") - public T autoDriverDownload(Consumer configurer) { + public T autoDriverDownload(Consumer configurer) { if (this.autoDriverDownloadConfigurer != null) { LOGGER.warn(".autoDriverDownload() has already been called. Overwriting previous calls."); } @@ -145,4 +146,27 @@ protected void autoQuitDriverIfAskedFor(WebDriver driver) { } } + /** + * Configures the driver with the given {@link WebDriverEventListener}. + * + * @param webDriverEventListener The webDriverEventListener to be set. + * @return A self reference for further configuration. + * @since 0.19.0 + */ + @SuppressWarnings("unchecked") + public T withWebDriverEventListener(WebDriverEventListener webDriverEventListener) { + this.webDriverEventListener = webDriverEventListener; + return (T) this; + } + + protected WebDriver attatchEventListner(WebDriver webDriver) { + if (webDriverEventListener != null) { + EventFiringWebDriver efwd = new EventFiringWebDriver(webDriver); + efwd.register(webDriverEventListener); + return efwd; + } else { + return webDriver; + } + } + } diff --git a/src/main/java/io/github/seleniumquery/browser/driver/SeleniumQueryDriver.java b/src/main/java/io/github/seleniumquery/browser/driver/SeleniumQueryDriver.java index 4533080a..01140596 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/SeleniumQueryDriver.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/SeleniumQueryDriver.java @@ -50,16 +50,30 @@ public class SeleniumQueryDriver { /** *

- * Sets the argument as the current WebDriver instance, quitting the current one, if exists. + * Sets the argument as the current WebDriver instance, quitting the current one, if exists.. + * If you do not want to quit the current driver then you can use {@link #switchTo(WebDriver driver) switchTo} instead. *

* - * @param driver The WebDriver instante to be set as current. + * @param driver The WebDriver instance to be set as current. */ public void use(WebDriver driver) { quitAndClearCurrentWebDriver(); + switchTo(driver); + } + + /** + *

+ * Sets the argument as the current WebDriver instance, leaving the current driver state open, if exists. + *

+ * + * @param driver The WebDriver instance to be set as current. + */ + public void switchTo(WebDriver driver) { this.webDriver = driver; } + + /** *

Returns the {@link WebDriver} currently set.

*
    diff --git a/src/main/java/io/github/seleniumquery/browser/driver/builders/ChromeDriverBuilder.java b/src/main/java/io/github/seleniumquery/browser/driver/builders/ChromeDriverBuilder.java index d2d86a4a..11828f98 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/builders/ChromeDriverBuilder.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/builders/ChromeDriverBuilder.java @@ -124,7 +124,7 @@ protected WebDriver build() { autoDownloadDriverIfAskedFor(ChromeDriver.class); WebDriver webDriver = buildChrome(); autoQuitDriverIfAskedFor(webDriver); - return webDriver; + return attatchEventListner(webDriver); } private WebDriver buildChrome() { diff --git a/src/main/java/io/github/seleniumquery/browser/driver/builders/EdgeDriverBuilder.java b/src/main/java/io/github/seleniumquery/browser/driver/builders/EdgeDriverBuilder.java index 25ba3b16..d15810f3 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/builders/EdgeDriverBuilder.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/builders/EdgeDriverBuilder.java @@ -65,7 +65,7 @@ protected WebDriver build() { autoDownloadDriverIfAskedFor(EdgeDriver.class); WebDriver webDriver = buildEdge(); autoQuitDriverIfAskedFor(webDriver); - return webDriver; + return attatchEventListner(webDriver); } private WebDriver buildEdge() { diff --git a/src/main/java/io/github/seleniumquery/browser/driver/builders/FirefoxDriverBuilder.java b/src/main/java/io/github/seleniumquery/browser/driver/builders/FirefoxDriverBuilder.java index 80b083f7..7b1b109e 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/builders/FirefoxDriverBuilder.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/builders/FirefoxDriverBuilder.java @@ -126,7 +126,7 @@ protected WebDriver build() { autoDownloadDriverIfAskedFor(FirefoxDriver.class); WebDriver webDriver = buildFirefox(); autoQuitDriverIfAskedFor(webDriver); - return webDriver; + return attatchEventListner(webDriver); } private WebDriver buildFirefox() { diff --git a/src/main/java/io/github/seleniumquery/browser/driver/builders/HtmlUnitDriverBuilder.java b/src/main/java/io/github/seleniumquery/browser/driver/builders/HtmlUnitDriverBuilder.java index 0622a02d..e3ac9918 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/builders/HtmlUnitDriverBuilder.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/builders/HtmlUnitDriverBuilder.java @@ -104,7 +104,7 @@ public HtmlUnitDriverBuilder emulatingInternetExplorer() { protected WebDriver build() { WebDriver webDriver = buildHtmlUnit(); autoQuitDriverIfAskedFor(webDriver); - return webDriver; + return attatchEventListner(webDriver); } private WebDriver buildHtmlUnit() { diff --git a/src/main/java/io/github/seleniumquery/browser/driver/builders/InternetExplorerDriverBuilder.java b/src/main/java/io/github/seleniumquery/browser/driver/builders/InternetExplorerDriverBuilder.java index 0425dba2..c02f5ee3 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/builders/InternetExplorerDriverBuilder.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/builders/InternetExplorerDriverBuilder.java @@ -75,11 +75,11 @@ protected WebDriver build() { autoDownloadDriverIfAskedFor(InternetExplorerDriver.class); WebDriver webDriver = buildIE(); autoQuitDriverIfAskedFor(webDriver); - return webDriver; + return attatchEventListner(webDriver); } private WebDriver buildIE() { - DesiredCapabilities capabilities = capabilities(DesiredCapabilities.chrome()); + DesiredCapabilities capabilities = capabilities(DesiredCapabilities.internetExplorer()); configureIEServerExecutablePath(); try { diff --git a/src/main/java/io/github/seleniumquery/browser/driver/builders/OperaDriverBuilder.java b/src/main/java/io/github/seleniumquery/browser/driver/builders/OperaDriverBuilder.java index 7565e86e..3979bdd9 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/builders/OperaDriverBuilder.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/builders/OperaDriverBuilder.java @@ -117,7 +117,7 @@ protected WebDriver build() { autoDownloadDriverIfAskedFor(OperaDriver.class); WebDriver webDriver = buildOpera(); autoQuitDriverIfAskedFor(webDriver); - return webDriver; + return attatchEventListner(webDriver); } private WebDriver buildOpera() { diff --git a/src/main/java/io/github/seleniumquery/browser/driver/builders/PhantomJSDriverBuilder.java b/src/main/java/io/github/seleniumquery/browser/driver/builders/PhantomJSDriverBuilder.java index 9991ea48..c9711c73 100644 --- a/src/main/java/io/github/seleniumquery/browser/driver/builders/PhantomJSDriverBuilder.java +++ b/src/main/java/io/github/seleniumquery/browser/driver/builders/PhantomJSDriverBuilder.java @@ -88,7 +88,7 @@ protected WebDriver build() { autoDownloadDriverIfAskedFor(PhantomJSDriver.class); WebDriver webDriver = buildPhantomJS(); autoQuitDriverIfAskedFor(webDriver); - return webDriver; + return attatchEventListner(webDriver); } private WebDriver buildPhantomJS() { diff --git a/src/main/java/io/github/seleniumquery/internal/fluentfunctions/AndOrThen.java b/src/main/java/io/github/seleniumquery/internal/fluentfunctions/AndOrThen.java index 5863cf39..4a23f8dc 100644 --- a/src/main/java/io/github/seleniumquery/internal/fluentfunctions/AndOrThen.java +++ b/src/main/java/io/github/seleniumquery/internal/fluentfunctions/AndOrThen.java @@ -19,7 +19,6 @@ import io.github.seleniumquery.SeleniumQueryFluentAndOrThen; import io.github.seleniumquery.SeleniumQueryFluentFunction; import io.github.seleniumquery.SeleniumQueryObject; -import io.github.seleniumquery.SeleniumQueryWaitUntil; /** * A builder class that allows to specify the next step after waiting for some condition: to wait for more diff --git a/src/main/java/io/github/seleniumquery/utils/SelectorUtils.java b/src/main/java/io/github/seleniumquery/utils/SelectorUtils.java index e982a673..68463b15 100644 --- a/src/main/java/io/github/seleniumquery/utils/SelectorUtils.java +++ b/src/main/java/io/github/seleniumquery/utils/SelectorUtils.java @@ -33,7 +33,7 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.htmlunit.HtmlUnitWebElement; -import org.openqa.selenium.internal.WrapsDriver; +import org.openqa.selenium.WrapsDriver; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlHiddenInput; diff --git a/src/test/java/endtoend/browser/SeleniumQueryBrowserTest.java b/src/test/java/endtoend/browser/SeleniumQueryBrowserTest.java index eafa43ba..45a27457 100644 --- a/src/test/java/endtoend/browser/SeleniumQueryBrowserTest.java +++ b/src/test/java/endtoend/browser/SeleniumQueryBrowserTest.java @@ -16,10 +16,14 @@ package endtoend.browser; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; import static testinfrastructure.EndToEndTestUtils.classNameToTestFileUrl; import java.util.List; +import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.By; @@ -49,8 +53,8 @@ public void multiple_browser_instances_should_work_OK() { BrowserAgentTestUtils.openBrowserAgentTestHelperUrl(firefox); // then - BrowserAgentTestUtils.assertBrowserAgent(chrome, HtmlUnitDriverBuilderTest.HTMLUNIT_CHROME_AGENT_STRING); - BrowserAgentTestUtils.assertBrowserAgent(firefox, HtmlUnitDriverBuilderTest.HTMLUNIT_FF_AGENT_STRING); + BrowserAgentTestUtils.assertBrowserAgent(chrome, allOf(containsString("Chrome"), not(containsString("Firefox")))); + BrowserAgentTestUtils.assertBrowserAgent(firefox, allOf(containsString("Firefox"), not(containsString("Chrome")))); } @Test diff --git a/src/test/java/endtoend/browser/driver/SeleniumQueryDriverTest.java b/src/test/java/endtoend/browser/driver/SeleniumQueryDriverTest.java index f8eadc89..6c143df0 100644 --- a/src/test/java/endtoend/browser/driver/SeleniumQueryDriverTest.java +++ b/src/test/java/endtoend/browser/driver/SeleniumQueryDriverTest.java @@ -16,9 +16,13 @@ package endtoend.browser.driver; +import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.htmlunit.HtmlUnitDriver; +import org.openqa.selenium.support.events.AbstractWebDriverEventListener; + +import endtoend.browser.util.BrowserAgentTestUtils; import testinfrastructure.testdouble.org.openqa.selenium.WebDriverQuitSpy; import static io.github.seleniumquery.SeleniumQuery.$; @@ -27,6 +31,8 @@ import static org.junit.Assert.assertThat; import static testinfrastructure.testdouble.org.openqa.selenium.WebDriverQuitSpy.createWebDriverQuitSpy; +import java.util.concurrent.atomic.AtomicReference; + public class SeleniumQueryDriverTest { @Test @@ -104,4 +110,20 @@ public void useHtmlUnit__should_quit_the_previous_driver() { previousDriver.assertDriverWasQuit(); } + @Test + public void withWebDriverEventListener() { + // given + AtomicReference openedUrl = new AtomicReference<>(null); + $.driver().useHtmlUnit().withWebDriverEventListener(new AbstractWebDriverEventListener() { + @Override + public void beforeNavigateTo(String url, WebDriver driver) { + openedUrl.set(url); + } + }); + // when + $.url(BrowserAgentTestUtils.AGENT_TEST_URL); + // then + Assert.assertEquals(BrowserAgentTestUtils.AGENT_TEST_URL, openedUrl.get()); + } + } diff --git a/src/test/java/endtoend/browser/driver/builders/HtmlUnitDriverBuilderTest.java b/src/test/java/endtoend/browser/driver/builders/HtmlUnitDriverBuilderTest.java index 599e7c8a..72eba53c 100644 --- a/src/test/java/endtoend/browser/driver/builders/HtmlUnitDriverBuilderTest.java +++ b/src/test/java/endtoend/browser/driver/builders/HtmlUnitDriverBuilderTest.java @@ -19,8 +19,11 @@ import static endtoend.browser.util.JsOnOffTestUtils.assertJavaScriptIsOff; import static endtoend.browser.util.JsOnOffTestUtils.assertJavaScriptIsOn; import static io.github.seleniumquery.SeleniumQuery.$; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsString; import static org.openqa.selenium.remote.CapabilityType.SUPPORTS_JAVASCRIPT; +import org.hamcrest.Matcher; import org.junit.After; import org.junit.Test; import org.openqa.selenium.remote.DesiredCapabilities; @@ -31,8 +34,8 @@ public class HtmlUnitDriverBuilderTest { private static final String HTMLUNIT_IE_AGENT_STRING = "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"; - public static final String HTMLUNIT_CHROME_AGENT_STRING = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36"; - public static final String HTMLUNIT_FF_AGENT_STRING = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"; + private static final String HTMLUNIT_FF_AGENT_STRING = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0"; + private static final Matcher HTMLUNIT_CHROME_AGENT_MATCHER = allOf(containsString("Chrome"), containsString("Mozilla"), containsString("AppleWebKit"), containsString("Safari")); @After public void tearDown() { @@ -54,7 +57,7 @@ public void useHtmlUnit__should_emulate_CHROME_by_default() { // when $.driver().useHtmlUnit(); // then - BrowserAgentTestUtils.assertBrowserAgent(HTMLUNIT_CHROME_AGENT_STRING); + BrowserAgentTestUtils.assertBrowserAgent(HTMLUNIT_CHROME_AGENT_MATCHER); } @Test @@ -78,7 +81,7 @@ public void withJavaScript__should_set_js_ON_overriding_given_capabilities() { } @Test - public void emulatingFirefox__should_emulate_latest_firefox__that_is__FIREFOX_45() { + public void emulatingFirefox__should_emulate_latest_firefox() { // given // when $.driver().useHtmlUnit().emulatingFirefox(); @@ -92,7 +95,7 @@ public void emulatingChrome__should_emulate_CHROME() { // when $.driver().useHtmlUnit().emulatingChrome(); // then - BrowserAgentTestUtils.assertBrowserAgent(HTMLUNIT_CHROME_AGENT_STRING); + BrowserAgentTestUtils.assertBrowserAgent(HTMLUNIT_CHROME_AGENT_MATCHER); } @Test diff --git a/src/test/java/endtoend/browser/util/BrowserAgentTestUtils.java b/src/test/java/endtoend/browser/util/BrowserAgentTestUtils.java index 521e22ea..daef9b74 100644 --- a/src/test/java/endtoend/browser/util/BrowserAgentTestUtils.java +++ b/src/test/java/endtoend/browser/util/BrowserAgentTestUtils.java @@ -27,7 +27,7 @@ public class BrowserAgentTestUtils { - private static final String AGENT_TEST_URL = classNameToTestFileUrl(BrowserAgentTestUtils.class); + public static final String AGENT_TEST_URL = classNameToTestFileUrl(BrowserAgentTestUtils.class); public static void assertBrowserAgent(String agentString) { openBrowserAgentTestHelperUrl(); diff --git a/src/test/java/endtoend/functions/jquery/forms/val/ValFunction_ContentEditableTest.java b/src/test/java/endtoend/functions/jquery/forms/val/ValFunction_ContentEditableTest.java index bbe7ff50..a1d65900 100644 --- a/src/test/java/endtoend/functions/jquery/forms/val/ValFunction_ContentEditableTest.java +++ b/src/test/java/endtoend/functions/jquery/forms/val/ValFunction_ContentEditableTest.java @@ -58,6 +58,7 @@ public void val_read__divWithoutContentEditableAttribute___readsEmptyString() { @Test @ChromeShouldBeSkipped("chrome can't focus, see test below") + @FirefoxSkip("firefox can't focus either, see also text below") @JavaScriptEnabledOnly @EdgeSkip("NoSuchWindowException -- TODO add tests for positive case") public void val_write__divWithoutContentEditableAttribute___hasNoEffect() { @@ -66,9 +67,12 @@ public void val_write__divWithoutContentEditableAttribute___hasNoEffect() { @Test @FirefoxOnly - @JavaScriptDisabledOnly - public void val_write__divWithoutContentEditableAttribute___hasNoEffect__Firefox_JS_OFF() { - verifyAttemptToChangeValOfDivWithoutContentEditableHasNoEffect(); + public void val_write__divWithoutContentEditableAttribute___throws_exception__FIREFOX() { + try { + verifyAttemptToChangeValOfDivWithoutContentEditableHasNoEffect(); + } catch (org.openqa.selenium.WebDriverException e) { + assertThat(e.getMessage(), startsWith("Element
    is not reachable by keyboard")); + } } @Test @@ -136,12 +140,15 @@ private void verifyEditableDivAcceptsHtmlCharsCorrectly(String editableDivId, St assertThat($(editableDivId).html(), is(addCharsDependingOnDriver("TYPED <a>& STUFF"))); } + @SuppressWarnings("SameParameterValue") private String addCharsDependingOnDriver(String resultingHtml) { WebDriver driver = $.driver().get(); if (isIEDriver(driver)) { return " " + resultingHtml; - } else if (isFirefoxDriver(driver) || isOperaDriver(driver)) { + } else if (isOperaDriver(driver)) { return resultingHtml + " "; + } else if (isFirefoxDriver(driver)) { + return resultingHtml + "
    "; } return resultingHtml; } diff --git a/src/test/java/endtoend/functions/jquery/forms/val/ValFunction_IframeTest.java b/src/test/java/endtoend/functions/jquery/forms/val/ValFunction_IframeTest.java index bacb5623..6fabfcd8 100644 --- a/src/test/java/endtoend/functions/jquery/forms/val/ValFunction_IframeTest.java +++ b/src/test/java/endtoend/functions/jquery/forms/val/ValFunction_IframeTest.java @@ -63,9 +63,9 @@ private void verifyIframeTextRead(String expectedIframeText) { } /** - * IE simply dies when we try to FETCH an element from the iframe. If gives no stacktrace info. + * IE simply dies when we try to FETCH an element from the iframe. It gives no stacktrace info. * This had to be done for IE to work: $.driver().get().switchTo().frame(0); - * They suggested, but didnt have effect: WebElement editable = $.driver().get().switchTo().activeElement(); + * They suggested, but didn't have effect: WebElement editable = $.driver().get().switchTo().activeElement(); * Also suggested $.driver().get().switchTo().defaultContent(); before switching to frame. No use. * * @@ -73,7 +73,7 @@ private void verifyIframeTextRead(String expectedIframeText) { * Firefox reads correctly, but edition only works if click before typing (it is as if it doesn't properly focus the iframe body using sendkeys only). * Edge only types when clicking before (if not clicking, the value ends up empty) * Chrome works 100%. - * HtmlUnit reads, but doesnt type. + * HtmlUnit reads, but doesn't type. * PhantomJS same as Edge. */ @Test @@ -86,14 +86,14 @@ public void iframe_with_DesignMode_ON___values_are_CHANGED_correctly__CHROME() { @FirefoxOnly public void iframe_with_DesignMode_ON___values_are_CHANGED_correctly__FIREFOX__NOT_CLICKING() { // see comments above - verifyTypingAtIframeChangesValueAsExpected(is("iframe-body-content"), false); + verifyTypingAtIframeChangesValueAsExpected(is(""), false); } @Test @FirefoxOnly public void iframe_with_DesignMode_ON___values_are_CHANGED_correctly__FIREFOX__CLICKING() { // see comments above - verifyTypingAtIframeChangesValueAsExpected(is("iframe-body-content[typed-value]"), true); + verifyTypingAtIframeChangesValueAsExpected(is("[typed-value]"), true); } @Test diff --git a/src/test/java/integration/io/github/seleniumquery/by/DriverVersionUtilsTest.java b/src/test/java/integration/io/github/seleniumquery/by/DriverVersionUtilsTest.java index 2f9143d9..6aeb443a 100644 --- a/src/test/java/integration/io/github/seleniumquery/by/DriverVersionUtilsTest.java +++ b/src/test/java/integration/io/github/seleniumquery/by/DriverVersionUtilsTest.java @@ -54,7 +54,7 @@ private void assertDriverIsNotHtmlUnitDriverEmulatingIE(HtmlUnitDriver htmlUnitD @Test public void isHtmlUnitDriverEmulatingIE__firefox_non_deprecated_versions() { - assertDriverIsNotHtmlUnitDriverEmulatingIE(new HtmlUnitDriver(BrowserVersion.FIREFOX_45)); + assertDriverIsNotHtmlUnitDriverEmulatingIE(new HtmlUnitDriver(BrowserVersion.FIREFOX_52)); } @Test diff --git a/src/test/java/io/github/seleniumquery/functions/jquery/events/DoubleClickFunctionTest.java b/src/test/java/io/github/seleniumquery/functions/jquery/events/DoubleClickFunctionTest.java index 1ec214b4..88ae3c12 100644 --- a/src/test/java/io/github/seleniumquery/functions/jquery/events/DoubleClickFunctionTest.java +++ b/src/test/java/io/github/seleniumquery/functions/jquery/events/DoubleClickFunctionTest.java @@ -27,7 +27,7 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Keyboard; import org.openqa.selenium.interactions.Mouse; -import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Coordinates; import testinfrastructure.testdouble.org.apache.commons.logging.LogInjector; import testinfrastructure.testdouble.org.apache.commons.logging.LogSpy; import testinfrastructure.testdouble.org.openqa.selenium.WebDriverDummy; @@ -149,4 +149,4 @@ static class ThrowElementHiddenExceptionCoordinates extends CoordinatesSpy { throw new ElementNotVisibleException("simulating a hidden element"); } } -} \ No newline at end of file +} diff --git a/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/WebElementDummy.java b/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/WebElementDummy.java index dfca1853..311a8ebe 100644 --- a/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/WebElementDummy.java +++ b/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/WebElementDummy.java @@ -17,8 +17,8 @@ package testinfrastructure.testdouble.org.openqa.selenium; import org.openqa.selenium.*; -import org.openqa.selenium.interactions.internal.Coordinates; -import org.openqa.selenium.internal.Locatable; +import org.openqa.selenium.interactions.Coordinates; +import org.openqa.selenium.interactions.Locatable; import testinfrastructure.testdouble.PseudoTestDoubleException; import java.util.List; diff --git a/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/interactions/MouseDummy.java b/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/interactions/MouseDummy.java index c3fb6450..df1e0ad9 100644 --- a/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/interactions/MouseDummy.java +++ b/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/interactions/MouseDummy.java @@ -17,7 +17,7 @@ package testinfrastructure.testdouble.org.openqa.selenium.interactions; import org.openqa.selenium.interactions.Mouse; -import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Coordinates; import testinfrastructure.testdouble.PseudoTestDoubleException; public class MouseDummy implements Mouse { diff --git a/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/interactions/internal/CoordinatesDummy.java b/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/interactions/internal/CoordinatesDummy.java index ee62b1ea..e13928d3 100644 --- a/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/interactions/internal/CoordinatesDummy.java +++ b/src/test/java/testinfrastructure/testdouble/org/openqa/selenium/interactions/internal/CoordinatesDummy.java @@ -17,7 +17,7 @@ package testinfrastructure.testdouble.org.openqa.selenium.interactions.internal; import org.openqa.selenium.Point; -import org.openqa.selenium.interactions.internal.Coordinates; +import org.openqa.selenium.interactions.Coordinates; import testinfrastructure.testdouble.PseudoTestDoubleException; public class CoordinatesDummy implements Coordinates { diff --git a/src/test/java/testinfrastructure/testutils/EnvironmentTestUtils.java b/src/test/java/testinfrastructure/testutils/EnvironmentTestUtils.java index bbe4f533..ab9e2d2d 100644 --- a/src/test/java/testinfrastructure/testutils/EnvironmentTestUtils.java +++ b/src/test/java/testinfrastructure/testutils/EnvironmentTestUtils.java @@ -69,7 +69,17 @@ private static String getGitLastCommitMessageIfAvailable() { } public static boolean gitLastCommitMessageContains(String expected) { - return getGitLastCommitMessageIfAvailable().contains(expected); + String gitLastCommitMessageIfAvailable = getGitLastCommitMessageIfAvailable(); + banner(gitLastCommitMessageIfAvailable); + return gitLastCommitMessageIfAvailable.contains(expected); + } + + private static void banner(String gitLastCommitMessageIfAvailable) { + System.out.println("###############################################################################################"); + System.out.println("###############################################################################################"); + System.out.println("### gitLastCommitMessageIfAvailable: " + gitLastCommitMessageIfAvailable); + System.out.println("###############################################################################################"); + System.out.println("###############################################################################################"); } } diff --git a/wercker.yml b/wercker.yml index f7d10687..e3e1c79c 100644 --- a/wercker.yml +++ b/wercker.yml @@ -20,7 +20,7 @@ # Steps make up the actions in your pipeline # Read more about steps on our dev center: # http://devcenter.wercker.com/docs/steps/index.html -box: maven:latest +box: combient/java-mvn build: steps: