When comparing WD.js vs webdriver-sync, the Slant community recommends webdriver-sync for most people. In the question“What are the best Node.JS Selenium WebDriver client libraries / bindings?” webdriver-sync is ranked 3rd while WD.js is ranked 8th. The most important reason people chose webdriver-sync is:
### webdriver-sync avoids this browser.get("http://foo.html", function() { browser.title(function(err, title) { assert.ok(~title.indexOf('foo title'), 'Wrong title!'); browser.elementById('i am a link', function(err, el) { browser.clickElement(el, function() { browser.eval("window.location.href", function(err, href) { assert.ok(~href.indexOf('foo title 2')); browser.quit(); }); }); }); }); }); ### in favor of this - completely synchronous API! No promises or callbacks needed: driver.get("http://foo.html"); title = driver.getTitle(); link = driver.findElement(By.id('i am a link')); link.click(); assert(driver.getCurrentUrl().indexOf('foo title 2') > -1); title.should.equal('foo title'); console.log(title); driver.quit();
Ranked in these QuestionsQuestion Ranking
Pros
Pro Cleaner and more concise code than WebdriverJS
There is no need to pass the 'driver' instance around, and not as many parentheses.
Using WD.js
function login(username, password) {
return this
.waitForElementByCss('.loginForm', asserters.isDisplayed, seconds(explicit_wait))
.elementById('emailAddress').sendKeys(username)
.elementById('password').sendKeys(password)
.elementById('signInButton').click()
}
Using WebDriverJS
function login(driver, username, password) {
driver.wait(until.elementIsVisible(driver.findElement({css: '.loginForm'})), seconds(explicit_wait));
driver.findElement({id: 'emailAddress'}).sendKeys(username);
driver.findElement({id: 'password'}).sendKeys(password);
driver.findElement({id: 'signInButton'}).click();
}

Pro Synchronous. No promises or callbacks needed.
browser.get("http://foo.html", function() {
browser.title(function(err, title) {
assert.ok(~title.indexOf('foo title'), 'Wrong title!');
browser.elementById('i am a link', function(err, el) {
browser.clickElement(el, function() {
browser.eval("window.location.href", function(err, href) {
assert.ok(~href.indexOf('foo title 2'));
browser.quit();
});
});
});
});
});
in favor of this - completely synchronous API! No promises or callbacks needed:driver.get("http://foo.html");
title = driver.getTitle();
link = driver.findElement(By.id('i am a link'));
link.click();
assert(driver.getCurrentUrl().indexOf('foo title 2') > -1);
title.should.equal('foo title');
console.log(title);
driver.quit();

Pro Same API as Selenium Java
If you've used the Selenium API before, you won't have to learn a new API.
Cons

Con Dropped by Intern
Intern v1 used WD.js, but they dropped it in favor of developing Leadfoot.

Con Less activity than WebdriverIO
WebdriverIO issues: 34 open, 507 closed. First release May 2012 at v0.6
WD.js issues: 18 open, 216 closed. First release: April 2011
Con Difficult to install on Windows
Due to the dependencies for installing on Windows, the process can be tedious (Requires Python 2.7 and Visual Studio).
