【问题标题】:Handle multiple elements with the same selector with nightwatch.js使用 nightwatch.js 处理具有相同选择器的多个元素
【发布时间】:2017-06-12 10:00:44
【问题描述】:

我正在使用 nightwatch-cucumberPageObjects 来自动化测试。 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 中的多个元素,有和没有回调函数?在这种情况下你更喜欢什么?

【问题讨论】:

  • 没有办法避免回调,因为所有命令都是异步执行的。至于错误,这是由于this 的上下文在提供给this.api.elements 的回调中持有不同的引用。

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


【解决方案1】:

感谢@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)才能继续进行自动化测试。因为有时您必须先成功完成回调函数,然后才能继续进行自动化测试的下一步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2016-08-14
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多