如何用守夜人履行承诺

时间:2015-11-09 11:02:58

标签: javascript promise nightwatch.js

我正在从量角器切换到Nightwatch.js,我在使用Nightwatch处理承诺的方式时遇到了一些困难。

举一个例子,我试图计算满足给定标准的元素数量。 count函数位于页面对象中,因此与测试本身分开:

页面对象命令:

    countToDoList: function(browser) {
        browser.elements('css selector', "input[ng-model='todo.done']", function(result){
            return result.value.length;
        });
    }

和测试中的电话:

'Angular - 1' : function(browser) {
  var angular = browser.page.angularPO();
  var mainPage = angular.section.main;

  angular.openMainPage(browser);
  var countToDoBoxes = 0;

  countToDoBoxes = mainPage.countToDoList(browser);
  console.log("countToDoBoxes = " + countToDoBoxes);

  browser.end();
}

这将返回" countToDoBoxes = undefined"。根据我对量角器的(短期)经验,我认为这是由于函数没有履行承诺,当它被传递给" countToDoBoxes"。

有没有办法让这项工作?

2 个答案:

答案 0 :(得分:5)

我找不到elements的API说明,但是这是您的代码,经过修改后返回Bluebird承诺。 (您可以使用您选择的Promise库执行类似操作。)

countToDoList: function(browser) {
    return new Promise(function(resolve, reject) {
        browser.elements('css selector', "input[ng-model='todo.done']", function(result){
            resolve(result.value.length);
        });

    });
}

答案 1 :(得分:1)

我不会回答您的问题,相反,我将为您解决问题。我认为这也将帮助来此尝试使用Nightwatch的Google员工。

首先,Nightwatch没有基于Promise的API,它使用回调。如果您试图在Nightwatch中使用promises,那将是很痛苦的,因为您正在违背它的编程范例。

所以我认为应该做的是,首先,修改countToDoList函数,使其接收回调函数。用您获得的值调用它。

同样重要的是您返回browser,以便我们在此之后进行链接。

countToDoList: function(browser, callback) {
  return browser.elements('css selector', "input[ng-model='todo.done']", function(result){
    callback(result.value.length);
  });
}

现在,在测试中,使用countToDoList中的回调为countToDoBoxes分配一个值。然后,您需要链接perform方法。此方法确保将您放置在其回调中的任何内容添加到Nightwatch的命令队列的末尾。现在,您可以确保在尝试登录时拥有countToDoBoxes值。

'Angular - 1' : function(browser) {
  var angular = browser.page.angularPO();
  var mainPage = angular.section.main;

  angular.openMainPage(browser);
  let countToDoBoxes;

  mainPage
    .countToDoList(browser, function(count) {
      countToDoBoxes = count;
    })
    .perform(function() {
      console.log("countToDoBoxes = " + countToDoBoxes);
    })
    .end();
}

Understanding the Command Queue一文中对此进行了解释,出于某种未知的原因,它并非直接出现在我认为属于的Nightwatch文档中。