CasperJS再次waitForResource

时间:2015-06-12 12:33:49

标签: javascript casperjs

我正在使用

.waitForResource('/auth')
.then( .... )
.waitForResource('/auth')
.then( .... )

等待对/auth的ajax调用完成,然后再验证UI响应。

然而,随后对/auth的调用似乎会立即继续,因为它已经加载了该资源。

是否有某种方法可以告诉casperJS再次等待,或者清除该资源,以便它认为它没有加载第二个请求?

2 个答案:

答案 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延迟。