我有一个带有按钮的页面,该按钮由后端作业控制。一旦工作完成=>按钮启用。用户必须手动刷新页面才能看到启用的按钮。
我的目标:
我正在使用带有JavaScript的Protractor
这是我到目前为止所做的:
----------我的控制流程-----
it ('waiting for button', () => {
itTopicReg.waitForBtn();
});
---------来自itTopicReg的帮助脚本--------
proceedToQaBtn = element(by.buttonText('Proceed to Qa Environment'))
nIntervId = null
waitForBtn() {
this.nIntervId = setInterval(this.isBtnEnabled(), 10000);
};
isBtnEnabled() {
let count = 0;
if (this.proceedToQaBtn.isEnabled()) {
expect(this.proceedToQaBtn.isDisplayed()).toBe(true);
} else if (count < 10)
count++;
browser.navigate().refresh();
} else if (count >= 10) {
clearInterval(this.nIntervId);
};
我收到以下错误:
✗ waiting for button
- Failed: "callback" argument must be a function
at exports.setInterval (timers.js:411:11)
at ItTopicReg.waitForBtn
我是Protractor和JavaScript的新手,请原谅,如果那是显而易见的事情 我在这里搜索过,并没有找到怨恨的清洁解决方案 (喜欢 Protractor : wait for element to become invisible/hidden 要么 Refreshing page until element appears - JAVA - Selenium)
答案 0 :(得分:1)
传递给setInterval()
的第一个参数需要是一个函数。不要调用isBtnEnabled
,只需将其作为参数传递:
this.nIntervId = setInterval(this.isBtnEnabled, 10000);
// NOTE: no () here ^^
作为旁注,您的启用检查:
if (this.proceedToQaBtn.isEnabled()) {
有一个问题:无论元素的状态如何,它总是会评估为真 - isEnabled()
会返回一个承诺,根据定义这是真实的。如果要获取元素是否启用的实际布尔值,请解析promise:
this.proceedToQaBtn.isEnabled().then(function (isEnabled) {
if (isEnabled) {
// ...
}
});
此外,我认为您根本不应该使用setInterval()
。量角器有一个内置机制,可以明确地等待并定期检查页面上要满足的特定条件 - 查看browser.wait()
和一组内置expected conditions。 elementToBeClickable
感觉它符合您的使用案例:
var EC = protractor.ExpectedConditions;
browser.wait(EC.elementToBeClickable(this.proceedToQaBtn), 10000);
this.proceedToQaBtn.click();