到目前为止,在我用CasperJS编写的测试中,我一直在页面特定元素上使用waitForSelector()来确定页面是否已完全加载(包括所有异步ajax请求)。我希望能够提出一种更标准的等待页面加载的方式,并且想知道以下是否可能?
以客户身份注入以下内容(include.js)
$(document).ajaxStop(function() {
// Do something
})
根据jquery api描述ajaxStop:在所有Ajax请求完成时注册要调用的处理程序。
定义一个casper.waitForLoad函数,该函数在被调用时会等待"某些东西"在上面的代码块
在测试的几个部分中使用该功能。
关于// Do Something部分的任何提示也会受到赞赏:)我正在考虑在phantomJS中使用window.callPhantom功能,但我读到它在casperjs中没有得到官方支持。
答案 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();