如何用 Nightwatch 履行承诺

How to fulfill a promise with Nightwatch

我正在从 Protractor 切换到 Nightwatch.js,我在 Nightwatch 处理 promise 的方式上遇到了一些困难。

举个例子,我正在尝试计算满足给定条件的元素的数量。计数函数在页面对象中,因此与测试本身分开:

页面对象命令:

    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();
}

这个returns"countToDoBoxes = undefined"。根据我对 Protractor 的(短期)经验,我认为这是由于函数在传递给 "countToDoBoxes".

时没有履行承诺。

有没有办法让它工作?

我找不到 elements 的 API 描述,但这是您的代码,已修改为 return 蓝鸟承诺。 (您可以使用您选择的 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);
        });

    });
}

我不会回答你的问题,相反,我会展示你遇到的问题的解决方案。我认为这会对来到这里并尝试在 Nightwatch 中使用 promises 的 Google 员工有所帮助。

首先,Nightwatch 没有基于承诺的 API,它使用回调。如果您尝试在 Nightwatch 中使用 promises,那将会很痛苦,因为您违背了它的编程范式。

所以我认为应该做的是,首先修改countToDoList函数,让它接收一个回调函数。用你得到的值调用它。

你 return 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 文档中。