Mar*_*tin 6 javascript selenium cucumber selenium-webdriver nightwatch.js
我正在使用nightwatch-cucumberwithPageObjects来自动化测试。nightwatch-cucumber基于nightwatch.js. 所以,我对 JavaScript 完全陌生。到目前为止,我更喜欢使用 Java 作为 Selenium/WebDriver 自动化的语言。
我想编辑具有定义值的多个输入字段。问题是所有这些输入字段都有相同的选择器。并且输入字段的数量在测试开始时是未知的,或者因测试而异。所以,我需要一个解决方案。在“神圣”的 Java 世界中,我可以做这样的事情:
List<WebElement> listOfElements = webdriver.getElements('input.myclass');
for (WebElement el : listOfElements) {
el.sendKeys("abc");
}
Run Code Online (Sandbox Code Playgroud)
在 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;
}
}]
};
Run Code Online (Sandbox Code Playgroud)
但这对我不起作用。在这种情况下,我在测试执行 ( TypeError: Cannot read property 'elementIdValue' of undefined)时收到错误消息。另外,我不想在异步回调函数中处理所有内容,因为以下测试步骤可能需要对多个输入字段进行完整处理。
那么,我如何实现这样的解决方案来处理nightwatch-cucumber带有和不带有回调函数的多个元素?在这种情况下你更喜欢什么?
感谢@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;
}
}]
};
Run Code Online (Sandbox Code Playgroud)
因为回调函数内的代码异步运行,我认为您必须等待特殊条件(例如 with waitForElementVisible)才能继续进行自动化测试。因为有时您必须先成功完成回调函数,然后才能继续进行自动化测试的后续步骤。