JSPM

  • Created
  • Published
  • Downloads 1211
  • Score
    100M100P100Q101345F

Generator-based WebDriver client, wrapper around Wd.js

Package Exports

  • yiewd

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (yiewd) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

yiewd

A Wd.js wrapper that uses V8's new generators for cleaner code! It's called yiewd because it uses the new yield syntax with wd. yield + wd = yiewd. Right?

The problem

Let's say we want to write a webdriver test:

var wd = require('wd')
  , driver = wd.remote();

driver.init(desiredCaps, function(err, sessionId) {
  if (err) return postTest(err);
  driver.get("http://mysite.com", function(err) {
    if (err) return postTest(err);
    driver.elementById("someId", function(err, el) {
      if (err) return postTest(err);
      el.click(function(err) {
        if (err) return postTest(err);
        driver.elementById("anotherThing", function(err, el2) {
          if (err) return postTest(err);
          el2.text(function(err, text) {
            if (err) return postTest(err);
            text.should.equal("What the text should be");
            driver.quit(postTest);
          });
        });
      });
    });
  });
});

Yeah, that sucks. Look at that callback pyramid! Look at all those error checks!

The solution

Let's all be a little more sane, shall we?

var wd = require('yiewd');

wd.remote(function*(driver) {
  var sessionId, el, el2, text;
  sessionId = yield driver.init(desiredCaps);
  yield driver.get("http://mysite.com");
  el = driver.elementById("someId");
  yield el.click();
  el2 = driver.elementById("anotherThing")
  text = yield el2.text();
  text.should.equal("What the text should be");
  yield driver.quit();
});

Isn't that awesome?

How it works

Basically, you pass a generator to wd.remote. This generator receives a driver object. Now, anytime you would have had a callback, just yield the function. If anything would have been passed as an argument to the callback, you'll get it as the assignment to yield.

It takes a slight change of thought, but it's so much better than callbacks.

Enjoy!

Requirements

  • Node >= 0.11.3 (one with generators)
  • Make sure you start your test runner with the --harmony flag

Tests

Make sure you have your chromedriver-enabled Selenium server running, then:

mocha -R spec -t 60000 --harmony test/