失败:"callback" 参数必须是函数错误

Failed: "callback" argument must be a function ERROR

我有一个带有按钮的页面,该按钮由后端作业控制。作业完成后 => 按钮被启用。用户必须手动刷新页面才能看到启用的按钮。

我的目标:

  1. 检查按钮是否启用
  2. 如果按钮已启用 = 退出功能并继续控制流程的其余部分
  3. 如果按钮未启用,请等待 10 秒并刷新页面 检查按钮是否已启用,等等
  4. 不要超过 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 conditionselementToBeClickable 感觉它适合您的用例:

var EC = protractor.ExpectedConditions;
browser.wait(EC.elementToBeClickable(this.proceedToQaBtn), 10000);
this.proceedToQaBtn.click();