如何使用selenium webdriver承诺产量(发电机)?

时间:2013-11-05 09:02:13

标签: javascript node.js selenium-webdriver ecmascript-6 yield-keyword

我正在尝试使用node 0.11.x中的生成器来让我的生活更轻松地编写Selenium测试。我的问题是我不知道如何正确使用它们。我几乎100%肯定它一定是语法问题。

我正在使用官方selenium-webdriver模块(版本2.37.0)和co(版本2.1.0)来创建我的生成器。

这是一个没有发电机/产量魔法的常规测试:

driver.isElementPresent(wd.By.css('.form-login')).then(function (isPresent) {
  console.log(isPresent); // true
});

以下是尝试使用yield / generator魔法获得相同结果的两次尝试:

var isPresent = yield browser.isElementPresent(wd.By.css('.form-login'));
console.log(isPresent); // undefined

var isPresent = yield browser.isElementPresent(wd.By.css('.form-login')).then(function (isPresent) {
  console.log(isPresent); // true
});
console.log(isPresent); // undefined

正如您所看到的,isPresent总是undefined,除非在承诺的then()回调中。我必须承认,我对发电机或承诺都不太熟悉,所以我可能会遗漏一些非常明显的东西。

1 个答案:

答案 0 :(得分:2)

我提出了以下解决方案。它有效,但我不认为这是理想的。我觉得有更好/更简单的方式。

describe("The login form", function() {
  it("should have an email, password and remember me fields and a submit button", function *() {       

    var results = [];
    yield browser.isElementPresent(wd.By.css('.form-login'))
      .then(function (isPresent) {
        results.push(isPresent);
      });
    yield browser.isElementPresent(wd.By.css('.form-login input[name="email"]'))
      .then(function (isPresent) {
        results.push(isPresent);
      });
    yield browser.isElementPresent(wd.By.css('.form-login input[name="password"]'))
      .then(function (isPresent) {
        results.push(isPresent);
      });
    yield browser.isElementPresent(wd.By.css('.form-login button[type="submit"]'))
      .then(function (isPresent) {
        results.push(isPresent);
      });

    results.forEach( function (result) {
      result.must.be.true();
    });

  });

});