失败:"callback" 参数必须是函数错误
Failed: "callback" argument must be a function ERROR
我有一个带有按钮的页面,该按钮由后端作业控制。作业完成后 => 按钮被启用。用户必须手动刷新页面才能看到启用的按钮。
我的目标:
- 检查按钮是否启用
- 如果按钮已启用 = 退出功能并继续控制流程的其余部分
- 如果按钮未启用,请等待 10 秒并刷新页面
检查按钮是否已启用,等等
- 不要超过 10 次迭代等待。如果按钮仍然不可用 - 退出函数并使测试失败
我在 JavaScript
中使用量角器
这是我目前的情况:
------------我的控制流程-----
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)
传递给 setInterval()
的第一个参数 需要是一个函数 。不要调用 isBtnEnabled
,只需将其作为参数传递即可:
this.nIntervId = setInterval(this.isBtnEnabled, 10000);
// NOTE: no () here ^^
作为旁注,您的启用检查:
if (this.proceedToQaBtn.isEnabled()) {
有一个问题:无论元素的状态如何,它总是计算为真 - isEnabled()
returns 一个承诺,这是真实的定义。如果要获取元素是否启用的实际布尔值,请解决承诺:
this.proceedToQaBtn.isEnabled().then(function (isEnabled) {
if (isEnabled) {
// ...
}
});
此外,我认为您根本不应该使用 setInterval()
。 Protractor 有一个内置机制来显式等待并定期检查页面上要满足的特定条件 - 查看 browser.wait()
and a set of built-in expected conditions。 elementToBeClickable
感觉它适合您的用例:
var EC = protractor.ExpectedConditions;
browser.wait(EC.elementToBeClickable(this.proceedToQaBtn), 10000);
this.proceedToQaBtn.click();
我有一个带有按钮的页面,该按钮由后端作业控制。作业完成后 => 按钮被启用。用户必须手动刷新页面才能看到启用的按钮。
我的目标:
- 检查按钮是否启用
- 如果按钮已启用 = 退出功能并继续控制流程的其余部分
- 如果按钮未启用,请等待 10 秒并刷新页面 检查按钮是否已启用,等等
- 不要超过 10 次迭代等待。如果按钮仍然不可用 - 退出函数并使测试失败
我在 JavaScript
中使用量角器这是我目前的情况:
------------我的控制流程-----
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)
传递给 setInterval()
的第一个参数 需要是一个函数 。不要调用 isBtnEnabled
,只需将其作为参数传递即可:
this.nIntervId = setInterval(this.isBtnEnabled, 10000);
// NOTE: no () here ^^
作为旁注,您的启用检查:
if (this.proceedToQaBtn.isEnabled()) {
有一个问题:无论元素的状态如何,它总是计算为真 - isEnabled()
returns 一个承诺,这是真实的定义。如果要获取元素是否启用的实际布尔值,请解决承诺:
this.proceedToQaBtn.isEnabled().then(function (isEnabled) {
if (isEnabled) {
// ...
}
});
此外,我认为您根本不应该使用 setInterval()
。 Protractor 有一个内置机制来显式等待并定期检查页面上要满足的特定条件 - 查看 browser.wait()
and a set of built-in expected conditions。 elementToBeClickable
感觉它适合您的用例:
var EC = protractor.ExpectedConditions;
browser.wait(EC.elementToBeClickable(this.proceedToQaBtn), 10000);
this.proceedToQaBtn.click();