{"id":14978833,"url":"https://github.com/webdriverextensions/webdriverextensions","last_synced_at":"2025-05-06T21:40:48.488Z","repository":{"id":5878066,"uuid":"7095652","full_name":"webdriverextensions/webdriverextensions","owner":"webdriverextensions","description":"Make your WebDriver based Selenium tests more readable, reusability and maintainable by using WebDriver Extensions!","archived":false,"fork":false,"pushed_at":"2022-05-20T20:49:04.000Z","size":26657,"stargazers_count":102,"open_issues_count":26,"forks_count":45,"subscribers_count":21,"default_branch":"master","last_synced_at":"2025-03-31T03:11:16.573Z","etag":null,"topics":["page-object","selenium","selenium-webdriver","webdriver"],"latest_commit_sha":null,"homepage":"http://webdriverextensions.github.io","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webdriverextensions.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-12-10T15:28:25.000Z","updated_at":"2025-03-30T00:40:31.000Z","dependencies_parsed_at":"2022-08-19T15:20:51.403Z","dependency_job_id":null,"html_url":"https://github.com/webdriverextensions/webdriverextensions","commit_stats":null,"previous_names":[],"tags_count":51,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdriverextensions%2Fwebdriverextensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdriverextensions%2Fwebdriverextensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdriverextensions%2Fwebdriverextensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdriverextensions%2Fwebdriverextensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webdriverextensions","download_url":"https://codeload.github.com/webdriverextensions/webdriverextensions/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252775522,"owners_count":21802453,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["page-object","selenium","selenium-webdriver","webdriver"],"created_at":"2024-09-24T13:58:29.808Z","updated_at":"2025-05-06T21:40:48.465Z","avatar_url":"https://github.com/webdriverextensions.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Travis Build Status](https://travis-ci.org/webdriverextensions/webdriverextensions.svg?branch=master)](https://travis-ci.org/webdriverextensions/webdriverextensions) [![Maven Central](https://img.shields.io/maven-central/v/com.github.webdriverextensions/webdriverextensions.svg)](http://search.maven.org/#search%7Cga%7C1%7Cg%3Acom.github.webdriverextensions)\n\nWebDriver Extensions\n===================\n\nWebDriver Extensions is designed to simplify Java based Selenium/WebDriver tests. It's built on top of Selenium/WebDriver to make your tests more readable, reusabable and maintainable by combining the [Page Object Pattern](https://code.google.com/p/selenium/wiki/PageObjects) and [Bot Pattern](https://code.google.com/p/selenium/wiki/BotStyleTests).\n\nAvailable through the [Maven Central Repository](http://mvnrepository.com/search?q=webdriverextensions)! Latest release is version 3.11.1 which includes selenium-java 3.141.59 as a transitive dependency.\n\n\n\u003cbr\u003e\n\n### What's included in this framework?\n- A [Maven Plugin](https://github.com/webdriverextensions/webdriverextensions-maven-plugin#webdriver-extensions-maven-plugin) to manage, download and install drivers\n- [Annotation based JUnit Runner](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/WebDriverRunner.html) for running Selenium/WebDriver tests locally or remotely against multiple browsers\n- New classes for modelling your website e.g. [WebComponent](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebComponent.html) (an extendable WebElement), [WebPage](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html), [WebSite](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebSite.html) and [WebRepository](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebRepository.html)\n- A [Bot](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/Bot.html) providing static methods for interacting, asserting and checking conditions of WebElements, WebComponents, WebPages and WebSites\n- A WebSite and WebRepository [generators](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/generator/package-summary.html) that enables adding WebComponents, WebPages, WebSites and WebRepositories by [annotations](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/generator/annotations/package-summary.html)\n- A [Maven Archetype](https://github.com/webdriverextensions/webdriverextensions-archetype-quickstart#webdriver-extension-archetype-quickstart) for creating new projects\n\n\u003cbr\u003e\n\n### Want to Contribute?\nIf you find a bug or have a feature request please [create a new GitHub issue](https://github.com/webdriverextensions/webdriverextensions/issues/new) or even better clone this repository, commit your changes and make a [Pull Request](https://help.github.com/articles/using-pull-requests/).\n\n\u003cbr\u003e\n\n### Have any Questions?\nIf you have question you can [ask them in a GitHub issue](https://github.com/webdriverextensions/webdriverextensions/issues/new).\n\n\u003cbr\u003e\n\n# Content\n- [Hello World Example](#hello-world-example)\n    - [With WebDriver Extensions](#with-webdriver-extensions)\n    - [Without WebDriver Extensions](#without-webdriver-extensions)\n    - [Further increased readability with Groovy](#further-increased-readability-with-groovy)\n- [Getting Started](#getting-started)\n    - [Requirements](#requirements)\n    - [Use Maven to add WebDriver Extensions](#use-maven-to-add-webdriver-extensions)\n    - [Download and manage your drivers with the Maven Plugin](#download-and-manage-your-drivers-with-the-maven-plugin)\n    - [Speed up your tests by running them in parallel](#speed-up-your-tests-by-running-them-in-parallel)\n    - [Cross Browser test your website with the JUnitRunner](#cross-browser-test-your-website-with-the-junitrunner)\n    - [Model your website with the Page Object Pattern](#model-your-website-with-the-page-object-pattern)\n    - [Model your page components with the WebComponent](#model-your-page-components-with-the-webcomponent)\n    - [Make your test readable as instructions with the Bot Pattern](#make-your-test-readable-as-instructions-with-the-bot-pattern)\n    - [Create new projects with the Maven Archetype](#create-new-projects-with-the-maven-archetype)\n- [Javadoc](#javadoc)\n- [Changelog](#changelog)\n- [Contributors](#contributors)\n- [License](#license)\n\n\n\n\u003cbr\u003e\n\n# Hello World Example\nHere is an example of how a cross browser test looks like with and without the WebDriver Extensions Framework. The test will run on Firefox, Chrome and Internet Explorer. It will google for \"Hello World\" and assert that the search result contains the searched text \"Hello World\".\n\n\n\n### With WebDriver Extensions\n```java\n@RunWith(WebDriverRunner.class)\n@Firefox\n@Chrome\n@InternetExplorer\npublic class WebDriverExtensionsExampleTest {\n\n    // Model\n    @FindBy(name = \"q\")\n    WebElement queryInput;\n    @FindBy(name = \"btnG\")\n    WebElement searchButton;\n    @FindBy(id = \"search\")\n    WebElement searchResult;\n\n    @Test\n    public void searchGoogleForHelloWorldTest() {\n        open(\"http://www.google.com\");\n        assertCurrentUrlContains(\"google\");\n\n        type(\"Hello World\", queryInput);\n        click(searchButton);\n\n        waitFor(3, SECONDS);\n        assertTextContains(\"Hello World\", searchResult);\n    }\n}\n```\n_\u003csub\u003eImports are hidden for the sake of simplicity, for imports and instructions on how to run this example see this [gist](https://gist.github.com/andidev/ad006a454edfd9f0e9e5)\u003c/sub\u003e_\n\n\n\n\u003cbr\u003e\n\n### Without WebDriver Extensions\n```java\n@RunWith(Parameterized.class)\npublic class WebDriverExampleTest {\n    WebDriver driver;\n    @Parameters\n    public static Collection\u003cObject[]\u003e data() {\n        return Arrays.asList(new Object[][]{\n            {\"Firefox\"}, {\"Chrome\"}, {\"InternetExplorer\"}\n        });\n    }\n\n    public WebDriverTest(String browserName) {\n        if (browserName.equals(\"Firefox\")) {\n            driver = new FirefoxDriver();\n        } else if (browserName.equals(\"Chrome\")) {\n            driver = new ChromeDriver();\n        } else if (browserName.equals(\"InternetExplorer\")) {\n            driver = new InternetExplorerDriver();\n        }\n        PageFactory.initElements(driver, this);\n    }\n\n    @After\n    public void tearDown() {\n        driver.quit();\n    }\n\n    // Model\n    @FindBy(name = \"q\")\n    WebElement queryInput;\n    @FindBy(name = \"btnG\")\n    WebElement searchButton;\n    @FindBy(id = \"search\")\n    WebElement searchResult;\n\n    @Test\n    public void searchGoogleForHelloWorldTest() throws InterruptedException {\n        driver.get(\"http://www.google.com\");\n        assert driver.getCurrentUrl().contains(\"google\");\n\n        queryInput.sendKeys(\"Hello World\");\n        searchButton.click();\n\n        SECONDS.sleep(3);\n        assert searchResult.getText().contains(\"Hello World\");\n    }\n}\n```\n_\u003csub\u003eImports are hidden for the sake of simplicity, for imports and instructions on how to run this example see this [gist](https://gist.github.com/andidev/6c5dc8033c019e4c069d)\u003c/sub\u003e_\n\n\nAs you can see WebDriver Extensions Framework made the test almost readable as instructions you would give to someone who needs to manually perform this test. This is one of the main points of this framework. It also removed a lot of verbose boilerplate configuration code.\n\nFor the sake of simplicity this example does not demonstrate the [Page Object Pattern](https://code.google.com/p/selenium/wiki/PageObjects). Please keep on reading the [Getting Started](#getting-started) section to read more about how to create and use Page Objects.\n\n\n\n\u003cbr\u003e\n\n### Further increased readability with Groovy\nIf wanted one could further increase readability by using the Groovy language instead of Java. Then the Hello World example would look like this\n\n```groovy\n@Grab(group='com.github.webdriverextensions', module='webdriverextensions', version='3.11.1')\n@RunWith(WebDriverRunner)\n@Firefox\n@Chrome\n@InternetExplorer\nclass WebDriverExtensionsGroovyExampleTest {\n\n    // Model\n    @FindBy(name = \"q\")\n    WebElement queryInput;\n    @FindBy(name = \"btnG\")\n    WebElement searchButton;\n    @FindBy(id = \"search\")\n    WebElement searchResult;\n\n    @Test\n    void searchGoogleForHelloWorldTest() {\n        open \"http://www.google.com\"\n        assertCurrentUrlContains \"google\"\n\n        type \"Hello World\", queryInput\n        click searchButton\n\n        waitFor 3, SECONDS\n        assertTextContains \"Hello World\", searchResult\n    }\n}\n```\n\n_\u003csub\u003eImports are hidden for the sake of simplicity, for imports and instructions on how to run this example see this [gist](https://gist.github.com/andidev/b182c59a92d5ad66b035)\u003c/sub\u003e_\n\nNote that Groovy examples will not be covered by this document.\n\n\n\n\u003cbr\u003e\n\n# Getting Started\n\n### Requirements\nThe Selenium project is compiled with Java 8 since version 3.0.0. Therefore WebDriver Extensions also requires you to use Java 3 in version 3.0.0 and above.\nMaven is not a requirement but is preferred and referred to in this document.\n\n- Java 8 or above\n- Maven 3 or higher\n\n\n\n\u003cbr\u003e\n\n### Use Maven to add WebDriver Extensions\nAdd\n```xml\n\u003cdependency\u003e\n\t\u003cgroupId\u003ecom.github.webdriverextensions\u003c/groupId\u003e\n\t\u003cartifactId\u003ewebdriverextensions\u003c/artifactId\u003e\n\t\u003cversion\u003e3.11.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n...as a dependency in your [pom.xml](https://gist.github.com/andidev/ad006a454edfd9f0e9e5#file-pom-xml) file.\n\n\n\u003cbr\u003e\n\n### Download and manage your drivers with the [Maven Plugin](https://github.com/webdriverextensions/webdriverextensions-maven-plugin#webdriver-extensions-maven-plugin)\nThere is no need to download any drivers manually. Instead use the [WebDriver Extensions Maven Plugin GitHub](https://github.com/webdriverextensions/webdriverextensions-maven-plugin) to download and manage your drivers by adding\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003ecom.github.webdriverextensions\u003c/groupId\u003e\n    \u003cartifactId\u003ewebdriverextensions-maven-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e3.1.1\u003c/version\u003e\n    \u003cexecutions\u003e\n        \u003cexecution\u003e\n            \u003cgoals\u003e\n                \u003cgoal\u003einstall-drivers\u003c/goal\u003e\n            \u003c/goals\u003e\n        \u003c/execution\u003e\n    \u003c/executions\u003e\n    \u003cconfiguration\u003e\n        \u003cdrivers\u003e\n            \u003cdriver\u003e\n                \u003cname\u003eedgedriver\u003c/name\u003e\n                \u003cversion\u003e6.17134\u003c/version\u003e\n            \u003c/driver\u003e\n            \u003cdriver\u003e\n                \u003cname\u003einternetexplorerdriver\u003c/name\u003e\n                \u003cversion\u003e3.9.0\u003c/version\u003e\n            \u003c/driver\u003e\n            \u003cdriver\u003e\n                \u003cname\u003echromedriver\u003c/name\u003e\n                \u003cversion\u003e74.0.3729.6\u003c/version\u003e\n            \u003c/driver\u003e\n            \u003cdriver\u003e\n                \u003cname\u003egeckodriver\u003c/name\u003e\n                \u003cversion\u003e0.24.0\u003c/version\u003e\n            \u003c/driver\u003e\n            \u003cdriver\u003e\n                \u003cname\u003ephantomjs\u003c/name\u003e\n                \u003cversion\u003e2.1.1\u003c/version\u003e\n            \u003c/driver\u003e\n        \u003c/drivers\u003e\n    \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n...as a plugin in your [pom.xml](https://gist.github.com/andidev/ad006a454edfd9f0e9e5#file-pom-xml) file. Then simply just update the version tag of the driver when a new driver is available and re-run your tests with the `mvn test` command or your preferred IDE.\n\nThe plugin will download the most suitable driver for  your OS. The bit of the driver will be 32bit with the exception of running the tests from a linux 64bit OS. If you would like to specify the OS and bit of the drivers to download you can provide them with a `\u003cplatform\u003e` and `\u003cbit\u003e`-tag inside each `\u003cdriver\u003e`-tag. Platform can be set to `windows`, `mac` or `linux` while the bit can be set to `32` or `64`.\n\nThe drivers will placed in a folder called `drivers` in the project root. If you will use the provided [WebDriverRunner](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/WebDriverRunner.html) there is no need for passing driver paths as System Properties since the framework will take care of the for you. If you won't be using it make sure to point the drivers out manually.\n\nIf you have configured a proxy in the settings.xml file the first encountered active proxy will be used. To specify a specific proxy to use you can provide the proxy id in the configuration.\n\nIf you run your tests from eclipse make sure you've allowed the webdriverextensions-maven-plugin to run the install-drivers goal. You can do this by adding the following to your pom.xml\n```xml\n\u003cpluginManagement\u003e\n    \u003cplugins\u003e\n        \u003c!--Eclipse m2e settings needed to install drivers with the webdriverextensions-maven-plugin --\u003e\n        \u003cplugin\u003e\n            \u003cgroupId\u003eorg.eclipse.m2e\u003c/groupId\u003e\n            \u003cartifactId\u003elifecycle-mapping\u003c/artifactId\u003e\n            \u003cversion\u003e1.0.0\u003c/version\u003e\n            \u003cconfiguration\u003e\n                \u003clifecycleMappingMetadata\u003e\n                    \u003cpluginExecutions\u003e\n                        \u003cpluginExecution\u003e\n                            \u003cpluginExecutionFilter\u003e\n                                \u003cgroupId\u003ecom.github.webdriverextensions\u003c/groupId\u003e\n                                \u003cartifactId\u003ewebdriverextensions-maven-plugin\u003c/artifactId\u003e\n                                \u003cversionRange\u003e[1.0,)\u003c/versionRange\u003e\n                                \u003cgoals\u003e\n                                    \u003cgoal\u003einstall-drivers\u003c/goal\u003e\n                                \u003c/goals\u003e\n                            \u003c/pluginExecutionFilter\u003e\n                            \u003caction\u003e\n                                \u003cexecute\u003e\n                                    \u003crunOnIncremental\u003etrue\u003c/runOnIncremental\u003e\n                                \u003c/execute\u003e\n                            \u003c/action\u003e\n                        \u003c/pluginExecution\u003e\n                    \u003c/pluginExecutions\u003e\n                \u003c/lifecycleMappingMetadata\u003e\n            \u003c/configuration\u003e\n        \u003c/plugin\u003e\n    \u003c/plugins\u003e\n\u003c/pluginManagement\u003e\n```\n\nFor more information on configuring the driver please visit the [WebDriver Extensions Maven Plugin GitHub page](https://github.com/webdriverextensions/webdriverextensions-maven-plugin). If the latest drivers are not available yet please create an issue [here](https://github.com/webdriverextensions/webdriverextensions-maven-plugin/issues/new).\n\n\n\n\u003cbr\u003e\n\n### Speed up your tests by running them in parallel\nRun your tests in parallel by adding\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n    \u003cartifactId\u003emaven-surefire-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e2.18.1\u003c/version\u003e\n    \u003cconfiguration\u003e\n        \u003cparallel\u003eall\u003c/parallel\u003e\n        \u003cthreadCount\u003e10\u003c/threadCount\u003e\n        \u003cperCoreThreadCount\u003efalse\u003c/perCoreThreadCount\u003e\n    \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n...to your pom.xml file.\n\nThis configuration will run maximum 10 tests in parallel. For more information\nabout the configuration please see section [Fork Options and Parallel Test Execution](http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html) in the documentation of the [Maven Surefire Plugin](http://maven.apache.org/surefire/maven-surefire-plugin/index.html).\n\nTry not to use non final static variables within your tests if you run your tests in parallel.\nIf you really have to use static variables that are not defined as final make sure to wrap them\nin [InheritableThreadLocal](http://docs.oracle.com/javase/7/docs/api/java/lang/InheritableThreadLocal.html)\nobjects. In this way they will be static within the current thread and child threads (i.e. the current test).\n\nAlso before configuring to run your tests in parallel check that your website\nallows it. For example problems could occur when logging in with the same user\nat the same time (if your website supports a login functionality). There could\nalso be other reasons not to run tests in parallel.\n\n\n\n\u003cbr\u003e\n\n### Cross Browser test your website with the JUnitRunner\n\nRun your tests locally by using the [WebDriverRunner](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/WebDriverRunner.html)\n\n```java\nimport com.github.webdriverextensions.junitrunner.WebDriverRunner;\nimport com.github.webdriverextensions.junitrunner.annotations.*;\n\n@RunWith(WebDriverRunner.class)\n@Firefox\n@Chrome\n@InternetExplorer\n@Edge\n@PhantomJS\npublic class CrossBrowserTest {\n\n    // Add WebElements, WebPages and other supported web models to use in tests\n\n    @Test\n    public void test1() {\n        // Configure browsers to test by annotating the class\n    }\n\n    @Test\n    @Safari\n    public void test2() {\n        // ...or by annotating methods\n    }\n\n    @Test\n    @IgnoreInternetExplorer\n    public void test3() {\n        // ...and use the ignore annotations to ignore specific browsers\n    }\n\n    ...\n\n}\n```\n\n...or remotely by adding the [@RemoteAddress](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/RemoteAddress.html) annotaion\n\n```java\n@RunWith(WebDriverRunner.class)\n@RemoteAddress(\"http://your-remote-url\")\n@Firefox\n@Chrome\n@InternetExplorer\n@Edge\n@PhantomJS\npublic class CrossBrowserTest {\n\t...\n}\n```\n\nTo run your test headless without starting a browser, use the [@HtmlUnit](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/HtmlUnit.html) annotation. If wanted you can also run your tests against the Safari browser with the [@Safari](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/Safari.html) annotation (just make sure the chromedriver is installed). Note that there is currently a [WebDriver issue](https://code.google.com/p/selenium/issues/detail?id=7933) with running the SafariDriver on some OSX/Safari versions.\n\nBrowser `version` and `platform` settings can be passed as annotation parameters e.g. `@Firefox(version = \"35.0\", platform = Platform.MAC)`.\n\nThe desired capabilities can either be provided in JSON format as a string e.g. `@Chrome(desiredCapabilities = \"{ chromeOptions: { args: [''--start-maximized'] }\")` or by creating a new class that extends the WebDriver's `DesiredCapabilities` class\n```java\npublic class StartMaximized extends DesiredCapabilities {\n    public StartMaximized() {\n        ChromeOptions options = new ChromeOptions();\n        options.addArguments(\"--start-maximized\");\n        setCapability(ChromeOptions.CAPABILITY, options);\n    }\n}\n```\n...and passing that to the annotation e.g. `@Chrome(desiredCapabilitiesClass = StartMaximized.class)`.\n\nIf you want set a custom browser name this can be done by using the [@Browser](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/Browser.html) annotation e.g. `Browser(browserName = \"foo\")`.\n\nFor larger and more complex test grids the [@Browsers](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/Browsers.html) annotation can be used. For example to test the Firefox browser on Windows, Mac and Linux\n```java\n@Browsers(firefox = {\n    @Firefox(platform = Platform.WINDOWS),\n    @Firefox(platform = Platform.MAC),\n    @Firefox(platform = Platform.LINUX)\n})\n```\n\nIf you would like to use a custom driver path annotate the test with the  [@DriverPaths](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/DriverPaths.html) annotation, e.g.\n\n```java\n@DriverPaths(chrome=\"path/to/chromedriver\", internetExplorer =\"path/to/internetexplorerdriver\")\n```\n\nIf you want to run your test against 64bit Internet Explorer versions you can specify the path to the 64 bit driver with the [@DriverPaths](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/DriverPaths.html) annotation like this\n```java\n@DriverPaths(internetExplorer =\"drivers/internetexplorerdriver-windows-64bit.exe\")\n```\nanother way to do it is to set the `webdriverextensions.ie.driver.use64Bit` to `true`, e.g. when running the tests with maven: `mvn test -Dwebdriverextensions.ie.driver.use64Bit=true`.\n\nTo take screenshots on test failure annotate the test class with the [@TakeScreenshotOnFailure](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/TakeScreenshotOnFailure.html). The screenshots will be saved into a directory named `screenshots` located in the project root. The path to the screenshots directory can be configured either by annotating the test class with the  [@ScreenshotsPath](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/ScreenshotsPath.html) annotation or by setting the `webdriverextensions.screenshotspath` property. E.g.\n\n```java\n@RunWith(WebDriverRunner.class)\n@Firefox\n@TakeScreenshotOnFailure\n@ScreenshotsPath(\"path/to/screenshots\")\npublic class SomeTest {\n\t...\n}\n```\n\nThe implicitly wait for tests can be set by annotating test classes or methods with the [@ImplicitlyWait](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/annotations/ImplicitlyWait.html) annotation. E.g.\n\n```java\n@RunWith(WebDriverRunner.class)\n@Firefox\n@ImplicitlyWait(1)\npublic class SomeTest {\n    @Test\n    public void somethingToTest() {\n        // Implicittly wait is set to one second\n    }\n    @Test\n    @ImplicitlyWait(value = 1, unit = MINUTES)\n    public void somethingElseToTest() {\n        // Implicittly wait is set to one minute\n    }\n}\n```\n\nTo set other driver specific setting use the JUnit @Before annotation. The driver\ncan be retreived by using the [driver()](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/Bot.html#driver--) method in the [Bot](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/Bot.html) class. E.g.\n\n```java\n@RunWith(WebDriverRunner.class)\n@Firefox\npublic class SomeTest {\n    @Before\n    public void configure() {\n        driver().manage().timeouts().pageLoadTimeout(10, SECONDS);\n    }\n    ...\n}\n```\n\n\u003cbr\u003e\n\n### Model your website with the [Page Object Pattern](https://code.google.com/p/selenium/wiki/PageObjects)\n\nModel your website pages, e.g. a login page\n\n```html\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eLogin Page\u003c/title\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003cform\u003e\n            \u003clabel\u003eUsername\u003c/label\u003e \u003cinput name=\"username\"\u003e\n            \u003clabel\u003ePassword\u003c/label\u003e \u003cinput name=\"password\"\u003e\n            \u003cinput type=\"checkbox\" name=\"remember-me\"\u003e Remember me\n            \u003cbutton id=\"login-button\"\u003eLogin\u003c/button\u003e\n        \u003c/form\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\n...by extending the [WebPage](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html) class\n\n```java\nimport com.github.webdriverextensions.WebPage;\n\npublic class LoginPage extends WebPage {\n\n    @FindBy(name = \"username\")\n    public WebElement usernameInput;\n    @FindBy(name = \"password\")\n    public WebElement passwordInput;\n    @FindBy(name = \"remember-me\")\n    public WebElement rememberMeCheckbox;\n    @FindBy(id = \"login-buttom\")\n    public WebElement loginButton;\n\n    @Override\n    public void open(Object... arguments) {\n        // Define how to open this page, e.g.\n        open(\"https://www.your-website-url.com/login\");\n        assertIsOpen();\n    }\n\n    @Override\n    public void assertIsOpen(Object... arguments) {\n        // Define how to assert that this page is open, e.g.\n        assertTitleEquals(\"Login Page\");\n        assertIsDisplayed(usernameInput);\n        assertIsDisplayed(passwordInput);\n        assertIsDisplayed(rememberMeCheckbox);\n        assertIsDisplayed(loginButton);\n    }\n}\n```\n...and then add and use it in your tests\n\n```java\n@RunWith(WebDriverRunner.class)\n@Firefox\npublic class LoginPageTest {\n\n    // Add models to inject into test\n    LoginPage loginPage;\n\n    @Test\n    public void loginTest() {\n        open(loginPage); // Calls the open method defined in LoginPage\n        type(\"foo\", loginPage.username);\n        type(\"bar\", loginPage.password);\n        click(loginButtom);\n        assertIsNotOpen(loginPage); // Calls the assertIsNotOpen method in the abstract WebPage class which inverts the assertIsOpen method defined in LoginPage\n    }\n\n    ...\n\n}\n```\n\nSince the [WebPage](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html) class only implements a part of the the [Openable](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/internal/Openable.html) interface you have to implement the [open(Object... arguments)](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html#open-java.lang.Object...-) and [assertIsOpen(Object... arguments)](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html#assertIsOpen-java.lang.Object...-) methods yourself. As soon as this is done you can also call the [isOpen(Object... arguments)](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html#isOpen-java.lang.Object...-), [isNotOpen(Object... arguments)](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html#isNotOpen-java.lang.Object...-) and the [assertIsNotOpen(Object... arguments)](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html#assertIsNotOpen-java.lang.Object...-) methods inherited from the [WebPage](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html) class.\n\nThe [open(Object... arguments)](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html#open-java.lang.Object...-) and [assertIsOpen(Object... arguments)](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html#assertIsOpen-java.lang.Object...-) methods can take any number of arguments and therefore it is possible to pass entity ids or other required data needed to load the page. E.g. a page showing a specific order\n\n```java\npublic class OrderPage {\n\n    @FindBy(id = \"order-number\")\n    public WebElement orderNumber;\n    ...\n\n    @Override\n    public void open(Object... arguments) {\n        int orderNumberToOpen = (int) arguments[0];\n        System.err.println(\"https://www.your-website-url.com/order?orderid=\" + orderNumberToOpen);\n        assertIsOpen(orderNumberToOpen);\n    }\n\n    @Override\n    public void assertIsOpen(Object... arguments) {\n        int orderNumberToAssert = (int) arguments[0];\n        assertTextEquals(orderNumberToAssert, orderNumber);\n        ...\n    }\n}\n```\n\n...and then use it in your test\n\n```java\nopen(orderPage, 134523); // Calls the open method defined in OrderPage with the order number 134523 as an argument\n```\n\nThere is also a [WebSite](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebSite.html) class which can be used if you would want to create a Site Object i.e. a model of the complete website. It is actually no difference between the [WebPage](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html) and the [WebSite](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebSite.html) class except the name.\n\nAn alternative to using the [WebPage](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html) class is using the [WebRepository](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebRepository.html) class. The only difference is that it does not implement the [Openable](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/internal/Openable.html) interface and therefore there is no need to override and implement the `open(Object... arguments)` and `assertIsOpen(Object... arguments)` methods.\n\nNote that any class extending the [WebPage](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebPage.html), [WebSite](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebSite.html) or [WebRepository](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebRepository.html) class that are added as fields in the test will automatically be injected/instantiated if the [WebDriverRunner](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/WebDriverRunner.html) is used. If you won't run your tests with the [WebDriverRunner](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/WebDriverRunner.html) you can call the Selenium WebDriver `PageFactory.initElements` method and pass the [WebDriverExtensionFieldDecorator](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebDriverExtensionFieldDecorator.html) before running the test, e.g.\n\n```java\nPageFactory.initElements(new WebDriverExtensionFieldDecorator(yourDriver), this);\n```\n\n\n\n\u003cbr\u003e\n\n### Model your page components with the [WebComponent](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebComponent.html)\n\nModel repeating html content, e.g. table rows\n\n```html\n\u003ctable id=\"playlist\"\u003e\n     \u003ctr\u003e\n          \u003ctd class=\"track\"\u003eHey Joe\u003c/td\u003e\n          \u003ctd class=\"artist\"\u003eJimi Hendrix\u003c/td\u003e\n          \u003ctd class=\"time\"\u003e3:30\u003c/td\u003e\n          \u003ctd class=\"album\"\u003eAre You Experienced\u003c/td\u003e\n     \u003c/tr\u003e\n     \u003ctr\u003e\n          \u003ctd class=\"track\"\u003ePlay with Fire\u003c/td\u003e\n          \u003ctd class=\"artist\"\u003eThe Rolling Stones\u003c/td\u003e\n          \u003ctd class=\"time\"\u003e2:14\u003c/td\u003e\n          \u003ctd class=\"album\"\u003eThe Last time\u003c/td\u003e\n     \u003c/tr\u003e\n\n     ...\n\n\u003c/table\u003e\n```\n\n...by extending the [WebComponent](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebComponent.html)\n\n```java\nimport com.github.webdriverextensions.WebComponent;\n\npublic class PlaylistRow extends WebComponent {\n\n    @FindBy(className = \"track\")\n    public WebElement track;\n    @FindBy(className = \"artist\")\n    public WebElement artist;\n    @FindBy(className = \"time\")\n    public WebElement time;\n    @FindBy(className = \"album\")\n    public WebElement album;\n}\n```\n\n...and then include it as you include a WebElement\n\n```java\n@FindBy(css = \"#playlist tr\")\npublic List\u003cPlaylistRow\u003e playlist;\n```\n\n...and then start using it\n\n```java\nassertTextEquals(\"Hey Joe\", playlist.get(0).track); // Use WebElements in WebComponents\nclick(playlist.get(0));                             // Use WebComponents as WebElements\n```\n\nNote that `@FindBy` annotation locators used inside a WebComponent have the WebComponent's html content as the search context. To locate html tags outside the WebComponent you could reset the search context by adding the [@ResetSearchContext](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/annotations/ResetSearchContext.html) annotation.\n\nIf you wish to delegate the method calls of a WebComponent to an underlying WebElement you can do so by annotating a WebElement inside the WebComponent with the [@Delegate](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/annotations/Delegate.html) annotation.\n\nIf you won't run your tests with the [WebDriverRunner](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/WebDriverRunner.html) you must call the Selenium WebDriver `PageFactory.initElements` method and pass the [WebDriverExtensionFieldDecorator](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebDriverExtensionFieldDecorator.html) before running the test, e.g.\n```java\nPageFactory.initElements(new WebDriverExtensionFieldDecorator(yourDriver), this);\n```\n\n\n\u003cbr\u003e\n\n### Make your test readable as instructions with the [Bot Pattern](https://code.google.com/p/selenium/wiki/BotStyleTests)\n\nSimply import the static [Bot](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/Bot.html) where you want to use it\n\n```java\nimport static com.github.webdriverextensions.Bot.*;\n```\n\n...and start interacting with your web models\n\n```java\nopen(\"https://www.your-website-url.com\");   // Open urls\ntype(\"testuser\", usernameInput);            // Type into WebElements referencing text input tags\ntype(\"ai78cGsT\", passwordInput);\nuncheck(rememberMeCheckbox);                // Check and uncheck WebElements referencing checkbox input tags\nclick(loginButton);                         // Click at WebElements\n\nopen(settingsPage)                          // Open WebPages\nselectOption(\"Swedish\", languageSelectBox); // Select options in WebElements referencing select tags\n```\n\n...and write your asserts\n\n```java\nassertIsOpen(homePage);                                        // Assert WebPages are open\nassertTextEquals(\"testuser\", currentUser);                     // Assert text in WebElements equals\nassertTitleStartsWith(\"Wikipedia - \");                         // Assert title starts with\nassertCurrentUrlMatches(\"http://[a-z]{2,3}.wikipedia.org/.*\"); // Assert current url matches regex\nassertHasClass(\"selected\", homeTab);                           // Assert WebElement tags has class\n// ...type assert then bring up the list of all supported asserts with your IDE's autocompletion\n```\n\n...and conditional statements\n\n```java\nif (hasClass(\"selected\", homeTab)) { // Check if WebElement tags has class\n    // ...do something\n}\nif (browserIsInternetExplorer()) {   // Check if browser is Internet Explorer\n    // ...handle cross browser difference\n}\n```\n\n...and wait for specific time and conditions\n\n```java\nwaitFor(3, MINUTES);                                         // Wait for specific time\nwaitForElementToDisplay(downloadCompletePopup, 30, SECONDS); // Wait for WebElements to display within specific time\n```\n\n...and use the driver\n\n```java\nSystem.out.println(driver().getPageSource());\n```\n\n...and take screenshots\n\n```java\ntakeScreenshots(\"screenshotfilename\") // Save a screenshot to the screenshots directory in the project root\n```\n\nFor a list of provided [Bot](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/Bot.html) methods take a look at the [javadoc for the Bot class](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/Bot.html) or use the autocompletion tool of your IDE (usally with Ctrl + Space and then start typing).\n\nIf you feel that some [Bot](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/Bot.html) methods are missing please describe them in a [new GitHub issue](https://github.com/webdriverextensions/webdriverextensions/issues/new) or even better clone this repository, commit the new methods and create a [Pull Request](https://help.github.com/articles/using-pull-requests/).\n\nIf you won't run your tests with the [WebDriverRunner](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/junitrunner/WebDriverRunner.html) make sure you set the driver in the [WebDriverExtensionsContext](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/WebDriverExtensionsContext.html) before using the [Bot](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/3.11.1/com/github/webdriverextensions/Bot.html)\n\n```java\nWebDriverExtensionsContext.setDriver(yourDriver);\n```\n\nThere is now also a VaadinBot that can be used if testing an application using the [Vaadin Framework](https://vaadin.com/home)\n\n\u003cbr\u003e\n\n### Create new projects with the [Maven Archetype](https://github.com/webdriverextensions/webdriverextensions-archetype-quickstart#webdriver-extension-archetype-quickstart)\nOpen your terminal and run\n```sh\nmvn archetype:generate -DarchetypeGroupId=com.github.webdriverextensions -DarchetypeArtifactId=webdriverextensions-archetype-quickstart\n```\n\n...and answer the questions to generate\n```\nprojectname\n├── drivers\n├── pom.xml\n└── src\n    ├── main\n    │   └── java\n    │       └── com\n    │           └── companyname\n    │               ├── SiteNameSite.java\n    │               ├── SiteNameSiteTest.java\n    │               ├── component\n    │               │   └── ExampleWebComponent.java\n    │               └── page\n    │                   └── MainPage.java\n    └── test\n        ├── java\n        │   └── com\n        │       └── companyname\n        │           └── MainPageTest.java\n        └── resources\n            └── logback-test.xml\n```\n\nNo need to add any drivers since the webdriverextensions-maven-plugin is configured to download\nthem for you!\n\nSimply just run the generated template test by executing\n```sh\ncd projectname\nmvn test\n```\n\n\n\u003cbr\u003e\n\n# Javadoc\nThe Javadoc of this project is available online hosted by javadoc.io. You can find the latest documentation over  [here](http://www.javadoc.io/doc/com.github.webdriverextensions/webdriverextensions). Please note that at the moment the documentation of the java classes and methods are limited (except for this documentation).\n\n\n\u003cbr\u003e\n\n# Changelog\n#### 3.11.1 (2019 June 2)\n- BUGFIX Fixed issue with WebComponents getWrappedWebElement() [fixes issue #125](https://github.com/webdriverextensions/webdriverextensions/issues/125)\n\n#### 3.11.0 (2019 June 2)\n- SELENIUM UPDATE Updated selenium version to 3.141.59\n- DEPENDENCY UPDATE Updated htmlunit-driver to 2.35.1\n- DEPENDENCY UPDATE Updated jna-platform to 5.3.1\n- DEPENDENCY UPDATE Updated gson to 2.8.5\n- DEPENDENCY UPDATE Updated commons-lang3 to 3.9\n\n#### 3.10.0 (2017 February 3)\n- BUGFIX WebDriverRunner now creates test and handles surefire.rerunFailingTestsCount correctly([PR 120](https://github.com/webdriverextensions/webdriverextensions/pull/120) thanks to  thanks to [@Snipx](https://github.com/Snipx))\n- ENHANCEMENT Added Bot methods taking advanced screenshots ([PR 119](https://github.com/webdriverextensions/webdriverextensions/pull/119) thanks to  thanks to [@xinaiz](https://github.com/xinaiz))\nAdded methods to Bot\n```java\nvoid takeScreenshotOf(WebElement element, String fileName)\nvoid takeScreenshotWithHighlight(WebElement element, String fileName)\nvoid takeScreenshotWithHighlight(WebElement element, int borderWidth, String fileName)\nvoid takeScreenshotWithHighlight(WebElement element, Color highlightColor, String fileName)\nvoid takeScreenshotWithHighlight(WebElement element, String fileName, int borderOffset)\nvoid takeScreenshotWithHighlight(WebElement element, int borderWidth, Color highlightColor, String fileName)\nvoid takeScreenshotWithHighlight(WebElement element, Color highlightColor, int borderOffset, String fileName)\nvoid takeScreenshotWithHighlight(WebElement element, int borderWidth, int borderOffset, String fileName)\nvoid takeScreenshotWithHighlight(WebElement element, int borderWidth, Color highlightColor, int borderOffset, String fileName)\n```\n\n#### 3.9.0 (2017 January 28)\n- ENHANCEMENT Added Bot methods for testing multiple tabs ([PR 118](https://github.com/webdriverextensions/webdriverextensions/pull/118) thanks to  thanks to [@xinaiz](https://github.com/xinaiz))\nAdded methods to Bot\n```java\nvoid openInNewTab(WebElement element)\nString openInNewTabAndFocus(WebElement element)\nSet\u003cString\u003e availableWindowHandles()\nString currentWindowHandle()\nvoid switchToWindow(String handle)\nvoid waitForNewTabToOpen(Set\u003cString\u003e oldWindowHandles)\nvoid waitForNewTabToOpen(Set\u003cString\u003e oldWindowHandles, int seconds)\nvoid waitForPageToLoad()\nvoid waitForPageToLoad(int seconds)\nvoid executeForLink(WebElement link, Runnable function)\nvoid executeForLinks(Collection\u003cWebElement\u003e links, Runnable function)\n```\n\n#### 3.8.1 (2017 January 22)\n- ENHANCEMENT Added getters for wrappedWebComponent and delegatedWebComponent in WebComponents    \n- ENHANCEMENT Added support for @FindAll annotation\n- BUGFIX Fixed issue with scrollTo throwing exceptions for WebComponents\n\n#### 3.8.0 (2017 December 10)\n- SELENIUM UPDATE Updated selenium version to 3.8.1\n- DEPENDENCY UPDATE Updated htmlunit-driver to 2.28\n- DEPENDENCY ADDED Added jna-platform as a dependency since it was removed from selenium\n\n#### 3.7.0 (2017 October 27)\n- SELENIUM UPDATE Updated selenium version to 3.6.0\n\n#### 3.6.1 (2017 September 12)\n- SELENIUM UPDATE Updated selenium version to 3.5.3\n\n#### 3.6.0 (2017 August 17)\n- SELENIUM UPDATE Updated selenium version to 3.5.1\n\n#### 3.5.2 (2017 July 6)\n- ENHANCEMENT Make subclassing WebDriverRunner easier thanks to [@Snipx](https://github.com/Snipx)\n- BUGFIX Override getDescription() so that only filtered methods are added to the Description thanks to [@Snipx](https://github.com/Snipx)\n\n#### 3.5.1 (2017 May 18)\n- BUGFIX Fixed Edge driver can't find file /drivers/edgedriver-windows-64bit issue\n\n#### 3.5.0 (2017 April 26)\n- SELENIUM UPDATE Updated selenium version to 3.4.0\n\n#### 3.4.0 (2017 Mars 15)\n- SELENIUM UPDATE Updated selenium version to 3.3.1\n\n#### 3.3.0 (2017 February 26)\n- SELENIUM UPDATE Updated selenium version to 3.2.0\n\n#### 3.2.0 (2017 February 22)\n- SELENIUM UPDATE Updated selenium version to 3.1.0\n\n#### 3.1.0 (2017 February 15)\n- ENHANCEMENT Added possibility to disable/ignore specific browsers tests by system property \"webdriverextensions.disabledbrowsers\"\nE.g.\n```bash\nmvn install -Dwebdriverextensions.disabledbrowsers=firefox,chrome,safari\n```\nthanks to [@alexnb](https://github.com/alexnb)) and [@dve](https://github.com/dve)\n\n#### 3.0.1 (2016 September 20)\n- BUGFIX Fixed issue with Marionette/Geckodriver not loading pages (caused by WebDriverRunner using an incorrect property)\n\n#### 3.0.0 (2016 September 19)\n- SELENIUM UPDATE Selenium 3.0.1 support\n- ENHANCEMENT Added support for Marionette/Geckodriver\n\n#### 2.9.2 (2016 September 30)\n- BUGFIX Added missing htmlunit dependency\n- BUGFIX Normalized Bot.textIn(WebElement webElement) method to trim spaces so that Chrome and PhantomJs drivers behaves as other drivers according to WebElement docs  \n\n#### 2.9.1 (2016 September 28)\n- SELENIUM UPDATE Updated to latest htmlunit-driver version\n\n#### 2.9.0 (2016 September 28)\n- ENHANCEMENT Added support to run test against PhantomJS locally\n- ENHANCEMENT Implemented Filterable support for WebDriverRunner (makes it possible to run single test methods from IntelliJ)\n\n#### 2.8.2 (2016 September 27)\n- SELENIUM UPDATE Updated selenium version to 2.53.1\n\n#### 2.8.1 (2016 September 16)\n- BUGFIX Fixes invalid screenshot filename on Windows platform ([PR 68](https://github.com/webdriverextensions/webdriverextensions/pull/68) thanks to [@consulbit](https://github.com/consulbit))\n\n#### 2.8.0 (2016 July 2)\n- ENHANCEMENT Added support for [@Edge](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/2.8.0/com/github/webdriverextensions/junitrunner/annotations/Edge.html) browser\n\n#### 2.7.0 (2016 May 24)\n- ENHANCEMENT Added doubleClick(WebElement webElement), waitUntil(Predicate\u003cWebDriver\u003e perdicate) and waitUntil(Predicate\u003cWebDriver\u003e perdicate, long secondsToWait) to Bot (thanks to [@dve](https://github.com/dve))\n- ENHANCEMENT Added VaadinBot that can be used if testing an application using the [Vaadin Framework](https://vaadin.com/home) (thanks to [@dve](https://github.com/dve))\n\n#### 2.6.2 (2016 April 9)\n- ENHANCEMENT Added ISO date and time to screenshot filename\n\n#### 2.6.1 (2016 April 9)\n- Made private constructor public again for Bot, BotUtils and WebDriverExtensionsContext classes [fix issue #63](https://github.com/webdriverextensions/webdriverextensions/issues/63)\n\n#### 2.6.0 (2016 Mars 17)\n- SELENIUM UPDATE Updated selenium version to 2.53.0\n- ENHANCEMENT SonarQube improvements (thanks to [@faisal-hameed](https://github.com/faisal-hameed) at [@DevFactory](https://github.com/DevFactory))\n\n#### 2.5.0 (2016 February 14)\n- SELENIUM UPDATE Updated selenium version to 2.52.0\n- BUGFIX WebPage.assertIsNotOpen(Openable, Object...) is now working as it should ([PR 57](https://github.com/webdriverextensions/webdriverextensions/pull/57) thanks to [@cplaetzinger](https://github.com/dve))\n\n#### 2.4.0 (2016 February 4)\n- SELENIUM UPDATE Updated selenium version to 2.50.1\n\n#### 2.3.0 (2016 January 20)\n- SELENIUM UPDATE Updated selenium version to 2.49.0\n\n#### 2.2.0 (2015 November 6)\n- JUNIT UPDATE Updated JUnit version to 4.12\n- BUGFIX Fixes issue with wrong test description when using JUnit 4.12 and above ([PR 56](https://github.com/webdriverextensions/webdriverextensions/pull/56) thanks to [@cplaetzinger](https://github.com/cplaetzinger))\n- BUGFIX Corrected incorrect screenshot file extension from .jpg to .png ([PR 55](https://github.com/webdriverextensions/webdriverextensions/pull/55) thanks to [@cplaetzinger](https://github.com/cplaetzinger))\n\n#### 2.1.2 (2015 November 4)\n- BUGFIX Fixed that Chrome Driver path is not set to blank if only Internet Explorer Driver path is set with @DriverPath annoation\n\n#### 2.1.1 (2015 October 14)\n- SELENIUM UPDATE Updated selenium version to 2.48.2\n\n#### 2.1.0 (2015 October 9)\n- SELENIUM UPDATE Updated selenium version to 2.48.1\n- BUGFIX Fixed bug when @TakeScreenshotOnFailure takes more than one screenshot \nof a failing test when more then one test fails in the same test class ([PR 52](https://github.com/webdriverextensions/webdriverextensions/pull/52) thanks to [@gunnee](https://github.com/gunnee))\n\n#### 2.0.1 (2015 September 30)\n- SELENIUM UPDATE Updated selenium version to 2.47.2\n\n#### 2.0.0 (2015 September 20)\n- JAVA 7 REQUIREMENT Now compiled with java 7 as target since selenium already does that since the 2.47.0 version\n\n#### 1.7.0 (2015 August 11)\n- SELENIUM UPDATE Updated selenium version to 2.47.1\n\n#### 1.6.0 (2015 June 9)\n- SELENIUM UPDATE Updated selenium version to 2.46.0\n\n#### 1.5.0 (2015 May 12)\n- FEATURE Added support for passing WebComponents as generic arguments to other WebComponents, WebPages and WebRepositories [fixes issue #50](https://github.com/webdriverextensions/webdriverextensions/issues/50). E.g.\n\n```java\npublic class TableComponent\u003cT extends WebComponent\u003e extends WebComponent {\n    @FindBy(...)\n    public List\u003cT\u003e rowList;\n}\n\npublic class ASearchResultType extends WebComponent {\n    // the model for the search result row\n}\n\n@FindBy(...)\nTableComponent\u003cASearchResultType\u003e resultTable;\n```\n\n- ENHANCEMENT Added descriptive messages to general field instantiation exceptions thrown by WebDriverExtensions\n- BUGFIX Removed driver from ThreadLocal when test finished running or failed\n\n#### 1.4.0 (2015 Mars 23)\n- FEATURE Added Bot method waitForElementToDisplay with TimeUnit as parameter\n- FEATURE Added @ImplicitlyWait annotation to WebDriverRunner\n- FEATURE Added @TakeScreenshotOnFailure and @ScreenshotsPath annotations to WebDriverRunner\n- FEATURE Added takeScreenshot method to Bot\n- BUGFIX Made @DriverPath and @RemoteAddress annotations only applicable as class annotations\n\n#### 1.3.0 (2015 Mars 12)\n- SELENIUM UPDATE Updated selenium version to 2.45.0\n\n#### 1.2.1 (2014 December 3)\n- ENHANCEMENT Added descriptive messages to instantiation exceptions thrown by WebDriverExtensions when WebPage, WebSite and WebRepository class is either abstract, has no no args constructor or has no accessible constructor\n\n#### 1.2.0 (2014 October 29)\n- SELENIUM UPDATE Updated selenium version to 2.44.0\n- BUGFIX Using JUnit @Test timeouts will no longer cause WebDriverExtensionsContext.getDriver() method to throw an exception\n\n#### 1.1.0 (2014 September 15)\n- SELENIUM UPDATE Updated selenium version to 2.43.1\n- FEATURE Added waitForElementsToDisplay\n- FEATURE Added ignore case to text bot methods\n- BUGFIX @Delegate annotated field is now allowed to be private\n\n#### 1.0.1 (2014 September 4)\n- BUGFIX Swallowing 'No runnable methods' error from BlockJUnit4ClassRunner so empty tests are allowed\n- BUGFIX Made created abstract open method in WebPage and SitePage so eclipse wont complain about @Override annotation\n\n\n#### 1.0.0 (2014 September 2)\n- Initial release!\n\n\n\n\u003cbr\u003e\n\n# Contributors\n- Thanks [Sauce Labs](https://saucelabs.com/) and [TestingBot](http://testingbot.com) for supporting this project with a free account for testing the remote setting for the [WebDriverRunner](http://static.javadoc.io/com.github.webdriverextensions/webdriverextensions/1.2.1/com/github/webdriverextensions/junitrunner/WebDriverRunner.html)\n- Thanks [Eniro](http://www.eniro.se/) for helping me develop and test this this framework\n\n\n\n\n\u003cbr\u003e\n\n# License\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this work except in compliance with the License.\nYou may obtain a copy of the License in the LICENSE file, or at:\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebdriverextensions%2Fwebdriverextensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebdriverextensions%2Fwebdriverextensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebdriverextensions%2Fwebdriverextensions/lists"}