Nightwatch.js 异步 Selenium 操作

Nightwatch.js Async Selenium Operations

假设我有一个 Nightwatch 测试,其中包含填写表格的两个步骤。作为第一步的一部分,我需要从页面动态查询一些数据(使用 Selenium api),然后使用该数据进行额外的 selenium 调用,并使用最终结果进行自定义断言。我需要使用 Selenium api 的原因不是我不知道如何使用普通的 Nightwatch 断言,而是普通的断言不足以测试我想测试的东西的类型。此外,在第一步结束时,单击一个按钮将移至表单的下一部分(为第二步做准备)。

(代码版本):

module.exports = {
  'Part 1': (client) => {

    // ... do cool stuff

    client.SOME_SELENIUM_COMMAND(...SOME_ARGS..., (result) => {

      client.SOME_OTHER_SELENIUM_COMMAND(...SOME_OTHER_ARGS..., (result2) => {
        // ... do more cool stuff with result2
      });
    });

    // moves the page onto part 2
    client.click(SOME_BUTTON);
  },

  'Part 2': (client) => {
    // ... part 2 stuff
  }
};

我的问题是:在 selenium 命令结果部分解决之前,测试进入第二部分。

我知道 Nightwatch 在内部使用某种事件队列和 EventEmitter 来确保命令以正确的顺序执行,但是看起来第一部分末尾的单击命令在命令之前排队在回调中即可。

您可以使用 Nightwatch perform command 执行一些其他命令,并在您希望测试继续到第 2 部分时调用 done()。您可以这样做:

module.exports = {

    'Part 1': (client) => {

    // ... do cool stuff

    client
    .perform(function(client, done) {

         client.SOME_SELENIUM_COMMAND(...SOME_ARGS..., (result) => {

             client.SOME_OTHER_SELENIUM_COMMAND(...SOME_OTHER_ARGS..., (result2) => {
                 // ... do more cool stuff with result2
                 // Call done to continue to Part 2
                 done();
             });
        });
    })
    // moves the page onto part 2
    .click(SOME_BUTTON);
  },

  'Part 2': (client) => {
    // ... part 2 stuff
  }
};