如何用守夜人兑现承诺

How to fulfill a promise with Nightwatch

本文关键字:承诺 守夜人 何用      更新时间:2023-09-26

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

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

页面对象命令:

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

这将返回"countToDoBoxe=undefined"。根据我在Protractor方面的(短暂)经验,我认为这是由于该函数在传递给"countToDoBoxes"时没有履行承诺。

有没有办法做到这一点?

我找不到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);
        });
    });
}

我不会回答你的问题,相反,我会展示你的问题的解决方案。我认为这将有助于谷歌员工,他们来到这里,试图在《守夜人》中使用承诺。

首先,Nightwatch没有基于promise-based的API,它使用回调。如果你试图在Nightwatch中使用promise,那将是痛苦的,因为你正在违背它的编程模式。

因此,我认为应该做的是,首先,修改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();
}

顺便说一句,这一切都在《理解命令队列》一文中解释过,由于某种未知的原因,我认为它不直接在Nightwatch文档中。