使用nightwatch.js

时间:2017-06-12 10:00:44

标签: javascript selenium selenium-webdriver cucumber nightwatch.js

我正在使用nightwatch-cucumber使用PageObjects来自动化测试。 nightwatch-cucumber基于nightwatch.js。所以,我对JavaScript完全不熟悉。到目前为止,我更喜欢使用Java作为Selenium / WebDriver自动化的语言。

我想用定义的值编辑多个输入字段。问题是所有这些输入字段都具有相同的选择器。并且输入字段的数量在测试开始时是未知的,或者与测试不同。所以,我需要一个解决方案。在“神圣的”java世界中,我可以做这样的事情:

List<WebElement> listOfElements = webdriver.getElements('input.myclass');
for (WebElement el : listOfElements) {
    el.sendKeys("abc");
}

在JavaScript中,它有点棘手,我不知道要处理。在我的PageObject中,我尝试了以下内容:

module.exports = {
  elements: {},
  commands: [{
    test() {
      this.api.elements('css selector', 'input.myclass',function (result) {
        for (var i = 0; i < result.value.length; i++) {
          console.log(result.value[i].ELEMENT);
          this.api.elementIdValue(result.value[i].ELEMENT, 'abc');
        }
      });

      this.api.pause(3000);
      return this.api;
    }
  }]
};

但这不适合我。在这种情况下,我在测试执行时遇到错误(TypeError: Cannot read property 'elementIdValue' of undefined)。另外,我不想处理异步回调函数中的所有内容,因为以下测试步骤可能需要在多个输入字段上完成处理。

那么,如何使用和不使用回调函数来实现这样的解决方案来处理nightwatch-cucumber中的多个元素?在那种情况下你更喜欢什么?

1 个答案:

答案 0 :(得分:3)

thx to @Florent B。

我回答了自己的问题。以下代码现在适用于我:

module.exports = {
  elements: {},
  commands: [{
    test() {
      this.api.elements('css selector', 'input.myclass',function (result) {
        for (var i = 0; i < result.value.length; i++) {
          this.elementIdValue(result.value[i].ELEMENT, 'abc');
        }
      });

      return this.api;
    }
  }]
};

因为回调函数中的代码是异步运行的,所以我认为你必须等待特殊条件(例如waitForElementVisible)继续进行自动化测试。因为在继续执行自动化测试中的后续步骤之前,有时您必须完成成功的回调函数。