0

我希望 casperjs 进行 ajax 调用,但等待来自我的服务器的结果。这可能需要 3 分钟,但我可以从运行脚本的结果中看出,casper.then 函数会超时,并且会在 30 秒后继续运行。我试过把 casper.options.waitTimeout = 180000 /* 3 分钟 */; 在我的代码中,它确实有效,并且我尝试使用这段代码,无论我的 api 调用的结果如何,它似乎每次都等待 3 分钟。

我也知道,无论如何,评估函数每次都只返回一个布尔值,这不起作用,因为我需要在脚本的其余部分返回的 api 调用数据。我怎样才能让这个功能等待 3 分钟?幕后发生了很多事情,所以是的,我需要等这么久。

var casper = require('casper').create();

casper.start('mysite.html', function() {
});

casper.then(function() {
  result = getSomethingFromMyServerViaAjax( theId );
});

这是我尝试过的另一种方法,无论 ajax 调用返回的速度如何,它似乎总是等待 3 分钟。

casper.waitFor(function check() {
    return this.evaluate(function() {
        return result = getSomethingFromMyServerViaAjax( theId ) /* this takes up to 3 minutes */;
    });
}, function then() {
   casper.log("Doing something after the ajax call...", "info");
   this.die("Stopping here for now", "error");
}, 180000 );

我已经在其他地方测试了我的 ajax 调用并且它可以工作,只要响应在 30 秒内返回,但如果它没有 casper,则跳过该块并每次都继续。

4

1 回答 1

2

你快到了。您需要触发长时间运行的呼叫。好像是同步的所以我把它放在里面setTimeout。一段时间后将结果写入window.resultFromMyServerViaAjax.

this.evaluate也是同步的,但是执行完之后wait会调度step,定期测试是否设置了window属性。

var casper = require('casper').create(),
    theId = "#whatever";

casper.start('mysite.html');

casper.then(function() {
    // trigger 
    this.evaluate(function(theId){
        window.resultFromMyServerViaAjax = null;
        setTimeout(function(){
            window.resultFromMyServerViaAjax = getSomethingFromMyServerViaAjax(theId);
        }, 0);
    }, theId);
    this.waitFor(function check() {
        return this.evaluate(function() {
            return !!window.resultFromMyServerViaAjax;
        });
    }, function then() {
       casper.log("Doing something after the ajax call...", "info");
    }, function onTimeout() {
       this.die("Stopping here for now", "error");
    }, 180000 );
});
casper.run();
于 2014-06-28T22:35:37.590 回答