使用$ .ajaxStop()确定何时在CasperJS中加载页面

时间:2015-06-22 17:20:46

标签: javascript jquery ajax phantomjs casperjs

到目前为止,在我用CasperJS编写的测试中,我一直在页面特定元素上使用waitForSelector()来确定页面是否已完全加载(包括所有异步ajax请求)。我希望能够提出一种更标准的等待页面加载的方式,并且想知道以下是否可能?

  1. 以客户身份注入以下内容(include.js)

    $(document).ajaxStop(function() {
        // Do something
    })
    
  2. 根据jquery api描述ajaxStop:在所有Ajax请求完成时注册要调用的处理程序。

    1. 定义一个casper.waitForLoad函数,该函数在被调用时会等待"某些东西"在上面的代码块

    2. 在测试的几个部分中使用该功能。

    3. 关于// Do Something部分的任何提示也会受到赞赏:)我正在考虑在phantomJS中使用window.callPhantom功能,但我读到它在casperjs中没有得到官方支持。

1 个答案:

答案 0 :(得分:1)

我会在include.js中执行类似的操作:

(function(){
    window._allAjaxRequestsHaveStopped = false;
    var interval;
    $(document).ajaxStop(function() {
        if (interval) {
            clearInterval(interval);
            interval = null;
        }
        interval = setTimeout(function(){
            window._allAjaxRequestsHaveStopped = true;
        }, 500);
    });
    $(document).ajaxStart(function() {
        window._allAjaxRequestsHaveStopped = false;
        if (interval) {
            clearInterval(interval);
            interval = null;
        }
    });
})();

这会为window对象设置一个(希望是唯一的)变量,以后可以检索它。如果在上一批次结束后有另一个请求,这也会等待一段时间。

在CasperJS中,您可能会执行以下操作以等待请求状态的更改。这使用了向casper对象添加新函数,并在内部使用casper.waitFor()来检查更改。

casper.waitForAjaxStop = function(then, onTimeout, timeout){
    return this.waitFor(function(){
        return this.evaluate(function(){
            return window._allAjaxRequestsHaveStopped;
        });
    }, then, onTimeout, timeout);
};

并像这样使用它:

casper.start(url).waitForAjaxStop().then(function(){
    // do something
}).run();

或者这个:

casper.start(url).thenClick(selector).waitForAjaxStop().then(function(){
    // do something
}).run();