我正在使用
.waitForResource('/auth')
.then( .... )
.waitForResource('/auth')
.then( .... )
等待对/auth
的ajax调用完成,然后再验证UI响应。
然而,随后对/auth
的调用似乎会立即继续,因为它已经加载了该资源。
是否有某种方法可以告诉casperJS再次等待,或者清除该资源,以便它认为它没有加载第二个请求?
答案 0 :(得分:3)
是否有某种方法可以告诉casperJS再次等待,或者清除该资源,以便它不会认为它已经为第二次请求加载了?
是的,这正是你能做的。您可以通过重新初始化资源数组来告诉CasperJS清除它之前看到的所有资源:
casper.resources = [];
如果您不希望 具有破坏性,那么您可以模仿casper.resourceExists()
函数查找资源的方式并仅删除这些资源:
casper.forgetResources = function(test){
"use strict";
this.checkStarted();
var testFn,
indexes = [],
utils = require('utils');
switch (utils.betterTypeOf(test)) {
case "string":
testFn = function _testResourceExists_String(res) {
return res.url.search(test) !== -1 && res.status !== 404;
};
break;
case "regexp":
testFn = function _testResourceExists_Regexp(res) {
return test.test(res.url) && res.status !== 404;
};
break;
case "function":
testFn = test;
if (phantom.casperEngine !== "slimerjs")
testFn.name = "_testResourceExists_Function";
break;
default:
throw new CasperError("Invalid type");
}
this.resources.forEach(function(res, i){
if (testFn(res)) {
indexes.push(i);
}
});
indexes = indexes.reverse();
indexes.forEach(function(i){
this.resources.splice(i, 1);
});
return this; // fluent API
};
casper.thenForgetResources = function(test){
this.then(function(){
this.forgetResources(test);
});
return this;
};
你会像这样使用它:
.waitForResource('/auth')
.then( .... )
.thenForgetResources('/auth')
.waitForResource('/auth')
.then( .... )
答案 1 :(得分:0)
结果证明它正常工作,我在UI更新之前只需要.wait(250)
来进行后续调用。
如果有人感兴趣我做了一个通用方法来捕获所有Ajax请求并强制执行250ms等待,所以你不需要做
.waitForResource('/my/resource')
.wait(250)
而是将其添加到您的测试中,或将其作为包含
加载/**
* Auto waitForResource on all Ajax requests.
* Inserts a 250ms delay after load to allow any page renders with response
*/
casper.options.onResourceRequested = function (casper, requestData){
//is this Ajax..
var isAjax = requestData.headers.some(function(header) {
return (header.name == "X-Requested-With" && header.value == "XMLHttpRequest");
});
if(isAjax){
casper.waitForResource(requestData.url, function(){
casper.wait(250); //wait quarter of a sec for any page render after an ajax load...
}, function(){
console.error("AJAX request for " + requestData.url + " timed out.")
}, 10000);
}
}
然后它将自动等待所有ajax请求,并为UI更新插入250ms延迟。