Ghost Driver is an implementation of the Remote WebDriver Wire protocol, using PhantomJS as back-end

Related tags

Testing ghostdriver
Overview

Release FOSSA Status

Ghost Driver

Ghost Driver is a pure JavaScript implementation of the WebDriver Wire Protocol for PhantomJS. It's a Remote WebDriver that uses PhantomJS as back-end.

GhostDriver is designed to be integral part of PhantomJS itself, but it's developed in isolation and progress is tracked by this Repository.

  • Current GhostDriver stable version: see releases
  • PhantomJS-integrated version is "1.2.0" (detro@2af7099a9) : contained in PhantomJS "2.1.1"
  • Current PhantomJSDriver Java bindings stable version: see Maven

For more info, please take a look at the changelog.

The project was created and is lead by Ivan De Marino.

IRC channel: #phantomjs-ghostdriver.

Setup

  • Download latest stable PhantomJS from here
  • Selenium version ">= 3.1.0"

THAT'S IT!! Because of latest stable GhostDriver being embedded in PhantomJS, you shouldn't need anything else to get started.

Register GhostDriver with a Selenium Grid hub

  1. Launch the grid server, which listens on 4444 by default: java -jar /path/to/selenium-server-standalone- .jar -role hub
  2. Register with the hub: phantomjs --webdriver=8080 --webdriver-selenium-grid-hub=http://127.0.0.1:4444
  3. Now you can use your normal webdriver client with http://127.0.0.1:4444 and just request browserName: phantomjs

(Java) Bindings

This project provides WebDriver bindings for Java under the name PhantomJSDriver. Here is the JavaDoc.

Bindings for other languages (C#, Python, Ruby, ...) are developed and maintained under the same name within the Selenium project itself.

Include Java Bindings in your Maven project

For versions >= 2.0.0, add the following to your pom.xml:

<repositories>
  <repository>
      <id>jitpack.ioid>
      <url>https://jitpack.iourl>
  repository>
repositories>
<dependency>
    <groupId>com.github.detrogroupId>
    <artifactId>ghostdriverartifactId>
    <version>2.1.0version>
dependency>

Include Java Bindings in your Gradle project

Just add the following to your build.gradle:

allprojects {
  repositories {
    maven { url 'https://jitpack.io' }
  }
}
dependencies {
    ...
    testCompile 'com.github.detro:ghostdriver:2.1.0'
    ...
}

Alternative: how to use it via RemoteWebDriver

Launching PhantomJS in Remote WebDriver mode it's simple:

$ phantomjs --webdriver=PORT

Once started, you can use any RemoteWebDriver implementation to send commands to it. I advice to take a look to the /test directory for examples.

F.A.Q.

What extra WebDriver capabilities GhostDriver offers?

  • GhostDriver extra Capabilities
    • phantomjs.page.settings.SETTING = VALUE - Configure page.settings on PhantomJS internal page objects (windows in WebDriver context) (see reference)
    • phantomjs.page.customHeaders.HEADER = VALUE - Add extra HTTP Headers when loading a URL (see reference)
    • phantomjs.page.whitelist - an array of regex expressions of urls to accept. eg. ['my-awesome-website.com']
    • phantomjs.page.blacklist - array of regex expressions of urls to ignore. The blacklist overrides the whitelist. eg. ['google.com', 'github.com']
    • unhandledPromptBehavior - set to dismiss to automatically dismiss all user prompts or set to accept to automatically accept all user prompts
    • loggingPrefs - ghostdriver has two logs browser and har. The logs default to "OFF". follow the DesiredCapabilities documentation to enable the logs.
  • PhantomJSDriver Java-binding Capabilities
    • phantomjs.binary.path - Specify path to PhantomJS executable to use
    • phantomjs.ghostdriver.path - Specify path to GhostDriver main/src.js script to use; allows to use a different version of GhostDriver then the one embed in PhantomJS
    • phantomjs.cli.args - Specify command line arguments to pass to the PhantomJS executable
    • phantomjs.ghostdriver.cli.args - Specify command line argument to pass to GhostDriver (works only in tandem with phantomjs.ghostdriver.path)

Want to help? Read on!

GhostDriver pushed the evolution of PhantomJS from the start. All the features required by PhantomJS to fit GhostDriver were designed to still feel "consistent" and "at home" with PhantomJS alone.

To drive that effort, I worked on a PhantomJS fork, and then pushed changes to PhantomJS master once agreed with the rest of the team on the changes.

If you are planning to contribute, that is the PhantomJS you should use.

Run validation tests

Here I show how to clone this repo and kick start the (Java) tests. You need Java SDK to run them. ghostdriver requires Java 1.8.

  1. git clone https://github.com/detro/ghostdriver.git
  2. Configure phantomjs_exec_path inside ghostdriver/test/config.ini to point at the build of PhantomJS you just did
  3. cd ghostdriver/test/java; ./gradlew test

Alternative: Run GhostDriver yourself and launch tests against that instance

  1. phantomjs --webdriver=PORT
  2. Configure driver inside ghostdriver/test/config.ini to point at the URL http://localhost:PORT
  3. cd ghostdriver/test/java; ./gradlew test

Project Directory Structure

Here follows the output of the tree -hd -L 3 command, trimmed of files and "build directories":

.
├── [ 102]  binding
│   └── [ 510]  java
│       ├── [ 204]  build
│       ├── [ 136]  gradle
│       ├── [ 884]  jars            <--- JARs containing Binding, related Source and related JavaDoc
│       └── [ 102]  src             <--- Java Binding Source
├── [ 442]  src                     <--- GhostDriver JavaScript core source
│   ├── [ 306]  request_handlers    <--- JavaScript "classes/functions" that handle HTTP Requests
│   └── [ 204]  third_party         <--- Third party/utility code
│       └── [2.0K]  webdriver-atoms <--- WebDriver Atoms, automatically imported from the Selenium project
├── [ 204]  test
│   ├── [ 476]  java                <--- Java Tests
│   │   ├── [ 136]  gradle
│   │   ├── [ 136]  out
│   │   └── [ 102]  src
│   ├── [ 238]  python              <--- Python Tests
│   │   └── [ 102]  utils
│   └── [ 340]  testcase-issue_240
└── [ 238]  tools                   <--- Tools (import/export)
    └── [ 136]  atoms_build_dir

20 directories

WebDriver Atoms

Being GhostDriver a WebDriver implementation, it embeds the standard/default WebDriver Atoms to operate inside open webpages. In the specific, the Atoms cover scenarios where the "native" PhantomJS require('webpage') don't stretch.

Documentation about how those work can be found here and here.

How are those Atoms making their way into GhostDriver? If you look inside the /tools directory you can find a bash script: /tools/import_atoms.sh. That script accepts the path to a Selenium local repo, runs the CrazyFunBuild to produce the compressed/minified Atoms, grabs those and copies them over to the /src/third_party/webdriver-atoms directory.

The Atoms original source lives inside the Selenium repo in the subtree of /javascript. To understand how the build works, you need to spend a bit of time reading about CrazyFunBuild: worth your time if you want to contribute to GhostDriver (or any WebDriver, as a matter of fact).

One thing it's important to mention, is that CrazyFunBuild relies on the content of build.desc file to understand what and how to build it. Those files define what exactly is built and what it depends on. In the case of the Atoms, the word "build" means "run Google Closure Compiler over a set of files and compress functions into Atoms". The definition of the Atoms that GhostDriver uses lives at /tools/atoms_build_dir/build.desc.

Let's take this small portion of our build.desc:

js_library(name = "deps",
  srcs = "*.js",
  deps = ["//javascript/atoms:deps",
          "//javascript/webdriver/atoms:deps"])

js_fragment(name = "get_element_from_cache",
  module = "bot.inject.cache",
  function = "bot.inject.cache.getElement",
  deps = [ "//javascript/atoms:deps" ])

js_library(name = "build_atoms",
  deps = [
    ...
    "//javascript/webdriver/atoms:execute_script",
    ...
  ]

The first part (js_library(name = "deps"...) declares what are the dependency of this build.desc: with that CrazyFunBuild knows what to build before fulfilling our build.

The second part (js_fragment(...) defines an Atom: the get_element_from_cache is going to be the name of an Atom to build; it can be found in the module bot.inject.cache and is realised by the function named bot.inject.cache.getElement.

The third part (js_library(name = "build_atoms"...) is a list of the Atoms (either defined by something like the second part or in one of the files we declared as dependency) that we want to build.

If you reached this stage in understanding the Atoms, you are ready to go further by yourself.

Contributions and/or Bug Report

You can contribute by testing GhostDriver, reporting bugs and issues, or submitting Pull Requests. Any help is welcome, but bear in mind the following base principles:

  • Issue reporting requires a reproducible example, otherwise will most probably be closed without warning
  • Squash your commits by theme: I prefer a clean, readable log
  • Maintain consistency with the code-style you are surrounded by
  • If you are going to make a big, substantial change, let's discuss it first
  • I HATE CoffeeScript: assume I'm going to laugh off any "contribution" that contains such aberrational crap!
  • Open Source is NOT a democracy (and I mean it!)

License

GhostDriver is distributed under BSD License.

FOSSA Status

Release names

See here.

Comments
  • Upgrade to selenium 2.44.0

    Upgrade to selenium 2.44.0

    • Upgrade to selenium-java 2.44.0
    • Remove using deprecated (and now removed) method Proxies.extractFrom, see https://code.google.com/p/selenium/issues/detail?id=8088
    opened by asolntsev 44
  • Added /element/../name and /element/../attribute/ commands

    Added /element/../name and /element/../attribute/ commands

    On review, not entirely happy with my check for "/attribute/" in the URL - would it be more robust to check urlParsed.chunks[-2] == 'attribute'?

    opened by alxndrsn 14
  • update ghostdriver for phantomjs 2.5

    update ghostdriver for phantomjs 2.5

    • fix page load for phantomjs 2.5.0
    • add unhandledPromptBehavior w3c capability
    • add blacklist/whitelist filters
    • fix sending keys to content editable elements
    • fix file upload for phantomjs 2.5.0
    • fix action chains with elements in iframes
    • replace calls to execute_script with atoms
    • add --remoteHost (@madhavajay)
    • add w3c defaults for add cookie
    • fix multiple file upload
    • add w3c timeout defaults
    • fix custom phantomjs headers
    • various bug fixes

    Issue #486

    opened by jesg 10
  • add error handling to send keys

    add error handling to send keys

    this should remove some edge cases where ghostdriver will freeze. specificity when the file element is not visible or when the file element has the multiple attribute. hopefully this will help users debugging #282 .

    edge cases covered:

    • log error if file does not exist
    • throw error on multiple file upload
    • throw error if clicking on file for file upload fails
    • throw error if focusing on the generic input element fails
    opened by jesg 10
  • Introduced acceptSslCerts capability

    Introduced acceptSslCerts capability

    This commit should fix #233, Let me know what do you think.

    Capability that allows to access to those sites using self-signed or invalid certificates, and where the certificate does not match the serving domain as if the HTTPS was configured properly. settings '--web-security=false' '--ssl-protocol=any' '--ignore-ssl-errors=true'

    Fixed some html tags in the javadoc

    opened by acarpe 10
  • Implemented window/current/size

    Implemented window/current/size

    Hey, how's things? Found a few moments today, so here's implementations of /session/:sessionId/window/current/size (both GET and POST).

    For error handling in the POST request, it might be more robust to check if width and height are valid integers, and possibly positive at that. What's the safest way to do that in JS? I suspect something like typeof(height) === 'number'.

    Also included are element/name and element/attribute. I did these a week or so ago so I'm surprised I didn't already submit a pull request. Let me know if I'm being forgetful and there was something wrong with these.

    Cheers,

    Alex

    opened by alxndrsn 10
  • Issue #228: Allowed the setting of custom headers

    Issue #228: Allowed the setting of custom headers

    This pull-request allows you to pass custom request headers down to PhantomJS. The syntax for doing so is a little different to the PhantomJS equivalent, but is relatively simple:

    In PhantomJS, you might do something like:

    var page = require('webpage').create();
    page.customHeaders = {
      'Accept-Language': 'it-IT',
      'Max-Forwards': '6'
    };
    

    And (with this patch), you can do:

    capabilities.setCapability(PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "Accept-Language", "it-IT");
    capabilities.setCapability(PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "Max-Forwards", "6");
    

    Similar resolved issues: Issue #134

    Technical notes: After the iterations on the implementation, we've ended up with a bit of duplication. My Javascript skills are sufficiently bad that I'm not going to refactor it without the tools to test afterward (latest commit is from a dying laptop with no charger), so I'll leave that in for now. To be fair, it reads fine anyway.

    Also, it'd be nice to update the page.customHeaders object so that we don't lose any previous key/values that may have existed. Not really a problem, as it doesn't look like we have any default headers at the moment anyway, but it might need to be changed in the future.

    opened by MorrisonCole 9
  • Implicit wait fix / adding test for it

    Implicit wait fix / adding test for it

    Synchronous checking for elements wasn't working (I think it wasn't yielding to the thread in order to allow the page to be updated). Also some logic around how implicit wait works with findElements (list) wasn't quite right.

    opened by lukeis 9
  • Various improvements.

    Various improvements.

    Hi, here's a modified pull request with the two methods indicated.

    Commands implemented here:

    GET /session/:id/source
    DELETE /session/:id/cookie
    GET /session/:id/element/:id/displayed
    
    opened by alxndrsn 9
  • Change new session response status to 302 (Found)

    Change new session response status to 302 (Found)

    This fix is necessary for correct work with selenium grid of this wire protocol realisation (incorrect redirect NATed selenium hub node).

    Similar changes has been applied for selenium project: https://github.com/SeleniumHQ/selenium/commit/8c3c65772d57ac8493522613a6b50674864a771a

    TODO 1.0.4 
    opened by valyukov 7
  • Improved examples architecture, instructions and reliability

    Improved examples architecture, instructions and reliability

    Hi Ivan,

    I quite heavily refactored the way the examples are run.

    The new architecture is much more extensible and reliable, which means they are easier to read for newcomers, it will be much simpler to create new demos and, more importantly, to collaborate as the executable paths are now extracted from the code.

    The README was corrected and updated, so the example command now works.

    The architecture is as follows:

    • abstract WebDriverTester superclass, from which all test cases should inherit;
    • GoogleCheese and GoogleCheeseServerOnly (renamed) only contain the particular crawling logic, as will all future test cases;
    • all setup (paths, supported drivers) is externalized in properties lists that lie in the config folder. See the path.properties.defaults file for details on how paths may be changed on each developer's machine without impacting the codebase.

    Best regards, Matti

    opened by MattiSG 7
  • Support socket proxy with ghostdriver

    Support socket proxy with ghostdriver

    Reference https://github.com/ariya/phantomjs/pull/15196#issuecomment-352778299

    I'm trying to use Phantomjs with ghostdriver (seleniumhq - java), everything works fine but I have one scenario where we have a socket proxy (not http proxy) but it throws an exception

    [ERROR - 2017-11-17T17:06:36.126Z] RouterReqHand - _handle.error - {"stack":"_getProxySettingsFromCapabilities@phantomjs://code/session.js:133:60\nSession@phantomjs://code/session.js:165:62\n_postNewSessionCommand@phantomjs://code/session_manager_request_handler.js:75:49\n_handle@phantomjs://code/session_manager_request_handler.js:44:35\n_handle@phantomjs://code/router_request_handler.js:70:37","line":133,"sourceURL":"phantomjs://code/session.js"}

    phantomjs://platform/console++.js:263 in error

    org.openqa.selenium.WebDriverException: Unable to parse remote response: TypeError - undefined is not an object (evaluating 'proxyCapability["httpProxy"].split') Build info: version: '3.7.1', revision: '8a0099a', time: '2017-11-06T21:01:39.354Z' System info: host: 'ubuntu', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.13.0-16-generic', java.version: '1.8.0_152' Driver info: driver.version: PhantomJSDriver at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:111) at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:73) at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:142) at org.openqa.selenium.phantomjs.PhantomJSCommandExecutor.execute(PhantomJSCommandExecutor.java:82) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:600) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:219) at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:142) at org.openqa.selenium.phantomjs.PhantomJSDriver.(PhantomJSDriver.java:116) at org.openqa.selenium.phantomjs.PhantomJSDriver.(PhantomJSDriver.java:105)

    opened by janario 0
  • Allow specifying path for storing cookies

    Allow specifying path for storing cookies

    In current implementation of ghostdriver there is no way to load cookies when starting a session. Passing --cookies-file to phantomjs doesn't work because ghostdriver's session.js creates a new cookie jar without any argument, which doesn't allow us to load or save cookies.

    I have added "phantomjs.cookies.path" capability that lets you specify the path for the cookie jar.

    enhancement 
    opened by kasatani 4
Releases(2.1.0)
  • 2.1.0(Jun 11, 2017)

    v2.1.0 (2017-6-6)

    Menma is a girl who suddenly appears several years after her death to Jinta and asks him to reunite their group of friends so her wish can be granted. Yet, she does not seem to remember what is her wish, but she knows she has to reunite her friends in order to remember. Despite being "dead", she is a very positive, energetic and lively person. According to Jinta, she is quite selfless and cries very often for others when they are hurt or upset, but not for herself. Jinta calls her "the beast of the summer" as he relates her to being a manifestation of his stress instead of a ghost girl. mal

    JavaScript Driver (Core)

    • no changes

    Java Binding

    • fix #528 deprecated api
    • upgrade selenium to 3.1.0
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Mar 29, 2017)

    v2.0.0 (2017-3-22)

    Sadako lived on for seven days in the well, destroying her fingernails while trying to climb out. After she finally died, her spirit created the cursed video tape using her "projected thermography" power. Anyone watches this tape will hear their phone ring and, after answering, Samara will say "Seven days" in a ghostly voice. Exactly seven days later the viewer will suffer a terrible death unless they have made a copy of the tape. imdb

    JavaScript Driver (Core)

    • fix page load for phantomjs 2.5.0
    • add unhandledPromptBehavior w3c capability
    • add blacklist/whitelist filters
    • fix sending keys to content editable elements
    • fix file upload for phantomjs 2.5.0
    • fix action chains with elements in iframes
    • replace calls to execute_script with atoms
    • add --remoteHost (@madhavajay)
    • add w3c defaults for add cookie
    • fix multiple file upload
    • add w3c timeout defaults
    • fix custom phantomjs headers
    • fix memory leak in the har log
    • add limited support for loggingPrefs capability
    • fix browser and har logs default to OFF

    Java Binding

    • add jitpack configuration
    • upgrade to java 8
    • upgrade to selenium 3.0.0
    • remove cyclic dependency
    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Jan 12, 2014)

    v1.1.1 (2014-01-12) (issues)

    Once there was a beautiful servant named Okiku. She worked for the samurai Aoyama Tessan. Okiku often refused his amorous advances, so he tricked her into believing that she had carelessly lost one of the family's ten precious delft plates. Such a crime would normally result in her death. In a frenzy, she counted and recounted the nine plates many times. However, she could not find the tenth and went to Aoyama in guilty tears. The samurai offered to overlook the matter if she finally became his lover, but again she refused. Enraged, Aoyama threw her down a well to her death.

    JavaScript Driver (Core)

    • ENHANCEMENT #170: Implement Session Isolation
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Jan 4, 2014)

    v1.1.0 (2014-01-01) (issues)

    Lord Banquo, Thane of Lochaber, is a character in William Shakespeare's 1606 play Macbeth. In the play, he is at first an ally to Macbeth (both are generals in the King's army) and they are together when they meet the Three Witches. [...]

    JavaScript Driver (Core)

    • ENHANCEMENT: /maximize window will set the window size to 1336x768, currently most common resolution online (see statcounter)
    • ENHANCEMENT #275: Implemented Browser and Network (HAR) Logging types
    • FIXED #284: Attempt to wait for Page to Load if input causes form submit
    • FIXED #291: Throw exception when attempting to set invalid timeout value
    • FIXED #259: Fix issue regarding mouse clicks
    • ENHANCEMENT #290: Enabled support for "Keep Alive" HTTP connections
    • ENHANCEMENT #262: Allow access to PhantomJS API from WebDriver (Driver part)
    • ENHANCEMENT #293: Import Selenium 2.39.0 WebDriver Atoms

    Java Binding

    • MINOR #251: Minor compilation issues for Binding
    • ENHANCEMENT #262: Allow access to PhantomJS API from WebDriver (Java Binding part)
    Source code(tar.gz)
    Source code(zip)
  • 1.0.4(Jul 25, 2013)

    v1.0.4 (2013-07-25) (issues)

    JavaScript Driver (Core)

    • ENHANCEMENT: Completely refactored the way events that initiate PAGE_LOAD events are handled
    • FIX #18: Now GhostDriver works when enabling --remote-debugger-port=PORT in PhantomJS
    • FIX #180: Avoid crashes when JS execution invokes window.close()
    • ENHANCEMENT #202: Ignore page load failures initiated by Click action (like other Drivers)
    • ENHANCEMENT #208: Added the ability to shutdown logging (i.e. Log Level OFF or NONE)
    • ENHANCEMENT #210: Ensuring we don't switch windows via empty string
    • FIX #213: mouseButtonDown was broken
    • FIX #215: Improve URL parsing to ensure we don't take /status as a URL instead of part of the protocol
    • FIX #216: Fixed issue where sometimes a failed click would cause a Parse error
    • ENHANCEMENT #228: Allow the setting of page.customheaders via Capabilities
    • FIX #240: Stopping all ongoing HTTP requests before starting to "wait for page load" was not a good idea
    • ENHANCEMENT #242: Trim URL before trying to load it
    • FIX #247: Implement changes to "HTTP POST /session" as per new WireProtocol specs

    Binding

    • ENHANCEMENT/FIX #179: Suppor for .withLog(logfile) option when using PhantomJSDriverService
    • ENHANCEMENT #228: Support in the Java Bindings to set page.customheaders via Capabilities
    • FIX 246: Avoid Cast Exception in Binding when passing phantomjs.cli.args through Selenium Server or Grid

    PhantomJS (code in PhantomJS master repo)

    • FIX #204: PhantomJS webserver module should not assume UPPERCASE or lowercase for HTTP headers, as per RFC 2616 - see also

    Test

    • Many more Java test to prove or disprove issues that have been submitted
    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Jul 2, 2013)

    v1.0.3 (2013-03-18) (issues)

    JavaScript Driver (Core)

    • FIX: Rewritten code that deals with "wait for Page Load" on Clicks (based on new page.loading property - see below) - This closed multiple issues
    • FIX: sendKeys('\n') should deliver an Enter keycode, not Return
    • FIX: New Sessions have at least 1 Window on creation: this stops the _cleanWindowlessSessions code to delete brand new session that haven't yet been used
    • FIX: Handle Frame-Switching when frame has no name
    • FIX: Handle Frame-Switching when frame has no name and no #id
    • FIX: Ensure File exists before attempting Upload
    • ENHANCEMENT: Upgraded WebDriver Atoms to Selenium 2.31.0

    Binding

    • FIX: Issues with "save_screenshot" method
    • FIX: Java Binding should handle Proxy configuration provided as a Map in the Capabilities (like Ruby or NodeJS bindings do)
    • FIX: PhantomJSDriver.Builder.withLogFile() is now implemented correctly and not ignored
    • ENHANCEMENT: Ability to pass CLI Arguments to PhantomJS process via Capability phantomjs.cli.args

    PhantomJS (code in PhantomJS master repo)

    • ENHANCEMENT: Added properties page.loading and page.loadingProgress to help track Page Loading
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Jul 2, 2013)

  • 1.0.1(Jul 2, 2013)

    v1.0.1 (2012-12-15) (issues)

    JavaScript Driver (Core)

    • ENHANCEMENT: Allow to set page.settings via Capabilities
    • FIX: At least 1 "current window handle" should be available on a new WebDriver instance
    • FIX: SwitchTo().Window() using the Window Handle
    • FIX: Invalid response when checking element equality
    • ENHANCEMENT: Wait for potential "Page Load" when "Element.click()" is used
    • ENHANCEMENT: Command /shutdown arrives via HTTP HEAD in some language bindings
    • ENHANCEMENT: Timeouts must be set to INFINITE by default

    PhantomJS (code in PhantomJS master repo)

    • FIX: Command line argument --webdriver-selenium-grid-hub is not taken into account

    Binding

    • BUG: PhantomJSDriverService replaced by DriverService in PhantomJSDriver constructor
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Jul 2, 2013)

    v1.0.0 (2012-11-25)

    JavaScript Driver (Core)

    • Implemented all the WireProtocol commands planned for 1.0.0 (see spreadsheet)

    Binding

    • Java Binding jar files created in /binding/java/jars
    • Bindings committed as third party library into the Selenium project (commit)

    Tests

    • Java tests cover just about what's needed
    • Python test are just a stub
    Source code(tar.gz)
    Source code(zip)
Owner
Ivan De Marino
Too much coffee, too little time http://ivandemarino.me/
Ivan De Marino
🎉Back end module of Sonic UI automation testing platform. Sonic-UI自动化测试平台后端模块。

?? Sonic UI automation testing platform. English | 简体中文 Background What is sonic ? Nowadays, automation testing, remote control and other technologies

Eason 1.7k Jan 1, 2023
Ready-to-use UI Test Automation Architecture using Java and Selenium WebDriver.

Selenium Test Automation Boilerplate Ready-to-use UI Test Automation Architecture using Java and Selenium WebDriver. Languages and Frameworks The proj

Tahanima Chowdhury 133 Dec 26, 2022
Java UCI Protocol implementation (Universal Chess Engine)

A simple UCI (Universal Chess Interface) Client written in Java. Tested with Stockfish 13. Documentation Starting / Closing the client By using the st

Andrei Ciobanu 22 Jan 2, 2023
🕵️ Lightweight utility to intercept WebDriver and WebElement method calls.

Lightweight utility to intercept webdriver and webelement method calls. Supports both Selenium and Appium drivers About | To Get Started | Installatio

Sudharsan Selvaraj 24 Jul 1, 2022
This repository contains example codes which will help you to know how to use selenium webdriver.

❓ What is this Repository about? This repo has example codes with Selenium 4 features. Websites used for testing are: automationpractice.com, saucedem

Mohammad Faisal Khatri 86 Dec 30, 2022
Selenium Webdriver: Page Object Model (POM) With Page Factory

Prepare Web Testing Instance or Environment Selenium Webdriver: Page Object Model (POM) With Page Factory Prerequisite software Download & Install JDK

Hiro Mia 14 Oct 18, 2022
Eclipse RAP Runtime (Remote Application Platform)

Eclipse RAP Runtime (Remote Application Platform) Welcome and thank you for your interest in this project. The Eclipse RAP Runtime provides a powerful

Eclipse RAP 14 Dec 15, 2022
cdp4j - Chrome DevTools Protocol for Java

cdp4j - Browser automation libray for Java cdp4j is Java library with a clear and concise API to automate Chrome/Chromium based browser. It use Google

WebFolder 148 Jun 16, 2022
🔌 Simple library to manipulate HTTP requests/responses and capture network logs made by the browser using selenium tests without using any proxies

Simple library to manipulate HTTP requests and responses, capture the network logs made by the browser using selenium tests without using any proxies

Sudharsan Selvaraj 29 Oct 23, 2022
Consume an async api (with callback) from sync endpoint using vert.x

vertx-async-to-sync Problem statement Suppose we have two services - A and B. In a trivial and everyday scenario, client makes request to A. A then do

Tahniat Ashraf Priyam 12 Oct 19, 2022
This repository contains examples using TestContainers in a Spring Boot Application

Sample REST CRUD API with Spring Boot, Mysql, JPA and Hibernate Using TestContainer to assure our Integration/API testing Steps to Setup 1. Build and

Guilherme Rogatto 4 Nov 29, 2021
BDD framework for automation using Selenium Cucumber and TestNg

Selenium Framework with Cucumber BDD framework for automation using Selenium Cucumber and TestNg The framework has following features Modular Design M

null 3 Jan 20, 2022
A project was created using the API of the TMDB page

TMDB API The project was created using the API of the TMDB page. You can find the description of the functions and their usage at https://developers.t

Atakan Koçyiğit 3 Jan 27, 2022
An e-commerce automation project of Selenium TestNG using Page Object Model

Selenium-POM-TestNG Prerequisites Install jdk 8 or any LTS version Configure JAVA_HOME and GRADLE_HOME Download Allure 2.17.2 and configure environmen

Asif Shahriar 2 Aug 4, 2022
Async-Await support for Vertx using Project Loom

Vertx-Async-Await Async-Await support for Vertx using Project Loom. import static com.augustnagro.vertx.loom.AsyncAwait.async; import static com.augus

August Nagro 28 Oct 10, 2022
This repository includes selenium tests examples using cucumber-jvm framework.

Cucumber Selenium Tests This repository includes cucumber selenium tests examples using wikipedia.org. Run tests To run tests on your local machine, y

Denys Vozniuk 3 Nov 27, 2022
Restful-booker API test automation project using Java and REST Assured.

Restful-booker API Test Automation Restful-booker API is an API playground created by Mark Winteringham for those wanting to learn more about API test

Tahanima Chowdhury 7 Aug 14, 2022
Framework for Mobile test automation using Appium with Java - BDD

appium-mobile-automation-framework-bdd Mobile automation framework using appium - BDD ?? Quick Start - Appium set up on Windows (Android): Install Jav

Thangaraj 18 Oct 19, 2022