失败:"回调"参数必须是函数ERROR

时间:2018-04-16 16:23:38

标签: javascript protractor e2e-testing

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

我的目标:

  1. 检查按钮是否已启用
  2. 如果按钮为Enabled =退出该功能并继续执行剩余的控制流程
  3. 如果未启用该按钮,请等待10秒钟并刷新页面 检查按钮是否已启用,依此类推
  4. 不要超过10次等待。如果按钮仍然不可用 - 退出该功能并使测试失败
  5. 我正在使用带有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

1 个答案:

答案 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 conditionselementToBeClickable感觉它符合您的使用案例:

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