Nightwatch.js异步Selenium操作

时间:2016-07-12 22:41:21

标签: nightwatch.js

假设我有一个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使用某种事件队列和EventEmitters来确保命令以正确的顺序执行,但是看来第一部分末尾的click命令在命令之前排队了回调可以。

1 个答案:

答案 0 :(得分:6)

您可以使用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
  }
};