1

我使用nightwatch-cucumber并使用PageObjects来自动化测试。 nightwatch-cucumber根据nightwatch.js。所以,我完全不熟悉JavaScript。到目前为止,我首选使用Java作为Selenium/WebDriver自动化的语言。使用与nightwatch.js相同的选择器处理多个元素

我想用定义的值编辑多个输入字段。问题是所有这些输入字段都有相同的选择器。输入字段的数量在测试开始时是未知的,或者不同于测试之间的测试。所以,我需要一个解决方案。在“圣” 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中带有和没有回调函数的多个元素?在那种情况下你喜欢什么?

+0

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

回答

0

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)去与自动测试。因为在继续进行自动化测试中的下一步之前,有时您必须先成功完成回调函数。

相关问题