如何在梦魇行动中使用等待函数evaluate_now?

时间:2017-09-21 13:39:14

标签: javascript node.js nightmare

我在剧本中使用梦魇行动。在我正在使用evaluate_now函数的动作中,如何在其中使用wait函数? 我知道我可以通过调用this.wait('example')来使用等待函数 但是在this.evaluate_now函数内无法访问wait函数。

Nightmare.action('example', function(done){
    this.evaluate_now(function() {
       //do some calculation and get element id
       var element = 'calculatedelement';
       activeTask.querySelector(element ).click();
       //I have to use the wait function here
    }        
    this.wait('body'); //wait is accessible here 
});

1 个答案:

答案 0 :(得分:1)

您不能在evaluate_now()中使用操作,而wait()是库中的操作(Source)。 evaluate_now()中提供的代码在电子实例(Source)中执行。

除此之外,您可以在evaluate_now()的回调函数中使用setTimeout()函数创建等待。下一个示例是一个操作,用于检查元素在视口中是否可见。

Nightmare.action('waitInViewport', function (selector, done) {
    // Keep evaluation function in a variable
    const evalFn = () => {
        this.evaluate_now((selector) => {
            const element = document.querySelector(selector);

            if (!element) {
                return false;
            }

            const rect = element.getBoundingClientRect();

            const height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
            const width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);

            return !(rect.top >= height || rect.bottom <= 0 ||
                rect.left >= width || rect.right <= 0);
        }, (err, isVisible) => {
            if (err) {
                return done(err);
            }
            if (isVisible) {
                return done(null, isVisible);
            }

            // If we are here, so we didn't found the element, so just run another evaluation after a delay
            setTimeout(evalFn, 500);
        }, selector);
    };

    // Don't forget to do the first call of the evaluation
    evalFn();
});

另一种方法是在调用自定义操作之前调用wait()函数。

Nightmare
    .wait('#myComponent')
    .example();

请记住,使用evaluate_now()的自定义操作仅限于执行某些同步指令,并且可能不适合您的用例。