Skip to content

An intuitive, clean and sync selenium-js implementation (also non blocking)

Notifications You must be signed in to change notification settings

hackhat/selenium-sync

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

selenium-sync

An easy and intuitive way to manage selenium tests with node.js. Intuitive because has simple methods and names you already know and not scriptic names like getWindowHandles.

Install

npm install selenium-sync --save-dev

API

Check the full API here.

Why this?

While is not yet complete, is more intuitive than every other selenium library for node.js. You have real sync code that can be ran and also a beautiful and intuitive API.

Features

  • Sync and non blocking using fibers (you can spin your own server from the test);
  • Browser/window/element concepts (easy to understand where you are apply a certain change);
  • Easy multi window management;
  • Easy css selector out of the box;
  • Very friendly API docs with types;
  • Uses the selenium for JavaScript;

Code features

  • Send special keys easily:

    el.type('selenium-sync', 'ENTER');
  • Open a new window:

    browser.openANewWindow('http://hackhat.com');
  • Find an element on a window:

    var el = someWindow.findEl('#search > input:first-child');
  • Advanced execute scripts:

    window.executeScript(function(data){
        alert(data.test);
    }, {
        test: 5
    });
    // Will alert the value 5 in the browser
  • Get current window:

    var w = browser.getCurrentWindow();
  • Switch to window by title:

    browser.switchToWindowByTitle('Facebook');
  • Wait until a window is closed:

    var previousWindow = browser.openANewWindow('some url');
    // The previous window will open the Facebook login popup
    // which can be easily grabbed like this:
    var facebookWindow = browser.getWindowByTitle('Facebook');
    // Now do your login and
    browser.waitWindowToBeClosed(facebookWindow);
    // Now you know that the Facebook popup window has been closed.

Fiber sync vs promise sync vs blocking sync

There are 3 different ways of using selenium and here are explained:

  • Promise sync (the official way to use selenium) is actually fake, it just queue up a lot of instructions to be ran. The downside is that you need to use callback if your next step requires data from a previous step.
  • Blocking sync is actually not that bad, but is blocking your node.js thread, therefore one of the first limitation is that you cannot run your server on the same thread. Is also using a wrapper over the Java selenium implementation instead of the JavaScript code provided by selenium.
  • Fiber sync (this library) allows you to run non-blocking code while having a real sync environment. Best of both worlds. Uses the JavaScript implementation provided by selenium and fibers to make it sync.

Sugar code

  • First install deps: npm install --save-dev selenium-sync fibers;

  • Then create a file test.js with those contents:

    var Future  = require('fibers/future');
    var Browser = require('../../src/index').Browser;
    
    // Everything in there is sync with fibers.
    Future.task(function(){
        var browser = new Browser();
    
        // Search on reddit.
        var redditW = browser.getCurrentWindow();
        redditW.goTo('http://www.reddit.com/r/webdev');
        var searchBox = redditW.findEl('#search > input:first-child');
        searchBox.click(); browser.sleep(500);
        redditW.click('#searchexpando > label > input');
        searchBox.sendKeys('hack_hat'); browser.sleep(500);
        redditW.click('#search > input:nth-child(2)'); browser.sleep(500);
        redditW.click('a.author[href="http://www.reddit.com/user/hack_hat"]');
        browser.sleep(2000);
    
        // Gihub search
        var githubW = browser.openANewWindow('https://github.com/'); browser.sleep(500);
        var searchBox2 = githubW.findEl('.js-site-search-form > input'); browser.sleep(100);
        searchBox2.type('selenium-sync', 'ENTER'); browser.sleep(500);
        githubW.click('a[href="/hackhat/selenium-sync"]'); browser.sleep(500);
        githubW.scrollTo('a[href="#api"]'); browser.sleep(500);
        browser.sleep(2000);
    
        // Website visit
        var hackhatW = browser.openANewWindow('http://hackhat.com');
    
        browser.sleep(200000);
    }).detach();
  • Then run it with node test.js;

  • Watch it do the work for you;

You should also know

  • WindowId: this is provided by the webdriver;
  • The browser updates every x ms to reflect the reality;

EJSON

In order to make EJSON work you need to require it and provide it on the client side on the test global variable like this:

window.test = {EJSON: require('EJSON')};

This is needed to transmit data properly from test to the client browser. If no EJSON is provided it will fall back on JSON.

Selenium docs

The bad part

  • Is not yet complete;

About

An intuitive, clean and sync selenium-js implementation (also non blocking)

Resources

Stars

Watchers

Forks

Packages

No packages published