Nightwatch中未执行Javascript代码

时间:2018-09-18 13:51:11

标签: javascript nightwatch.js execute

在Nightwatch中使用.execute时遇到问题。

当我在DOM中运行此代码时,它可以完美运行。但是,当我将其包装在Nightwatch中的execute命令中时,它甚至没有达到第一次单击的效果。因此,可能永远不会执行execute命令。

我在做什么错了?

预先感谢

LoopThroughQuestions: function() {
        this.waitForElementVisible('.next-button', constants.timeout.medium);                         
         this.api.execute(function() {
            var checkQuestion = function() {
                var nextButton = document.querySelector('.next-button');
                var answers = document.querySelectorAll('.flex-row.key');
                answers[0].click();
                nextButton.click();
                setTimeout(function () {
                    if (document.querySelector('.next-button')) {
                         checkQuestion();
                    } else {
                        console.log("Exit");
                    }
                }, 2000, "Running")
            }
        }, [])   ;

        return this;
    },

2 个答案:

答案 0 :(得分:0)

您已将变量checkQuestion定义为一个函数,但从未调用该函数。

尝试这样的事情:

LoopThroughQuestions: function() {
        this.waitForElementVisible('.next-button', constants.timeout.medium);                         
         this.api.execute(function() {
            var checkQuestion = function() {
                var nextButton = document.querySelector('.next-button');
                var answers = document.querySelectorAll('.flex-row.key');
                answers[0].click();
                nextButton.click();
                setTimeout(function () {
                    if (document.querySelector('.next-button')) {
                         checkQuestion();
                    } else {
                        console.log("Exit");
                    }
                }, 2000, "Running")
                checkQuestion();
            }
        }, [])   ;

        return this;
    },

回想一下,您也可以使用自调用匿名函数。

(function () {
  // body of the function
}());

答案 1 :(得分:0)

对于遇到相同问题的人;我使用executeAsync修复了该脚本,该脚本正在执行,但是对元素的等待不足

 TestLoop: function() {
        this.waitForElementVisible('.next-button', constants.timeout.medium);
        this.api.executeAsync(function() {
            let checkQuestion = function() {
                let nextButton = document.querySelectorAll('.next-button');
                let answers = document.getElementsByClassName('flex-row');
                let blueButton = document.querySelectorAll('.blue-inverse-button').length;
                answers[0].click();
                nextButton[0].click();
                setTimeout(() => {
                    if (document.querySelectorAll('.next-button')) {
                        console.log('Answering another question!');
                        checkQuestion();
                    }
                    if (blueButton === 1){
                        blueButton[0].click()
                        checkQuestion()
                    }
                    else {
                        console.log("Exiting?");
                    }
                }, 2000);
            };

            // Initiating the check question function
            return checkQuestion();

        },[], function(){
            console.log('Done?')
        });
    },