我希望casperjs进行ajax调用,但是等待来自我的服务器的结果。这可能需要3分钟,但我可以通过查看运行我的脚本的结果来判断,casper.then函数超时并且仅在30秒后继续运行。我试过把casper.options.waitTimeout = 180000 / * 3分钟* /;在我的代码中,它确实有效,并且我尝试使用这段代码,无论我的api调用结果如何,它似乎每次都要等待3分钟。
我也知道evaluate函数每次都会返回一个布尔值,无论如何,这都行不通,因为我需要在我脚本的其余部分返回的api调用数据。如何让这个功能等待3分钟?幕后有很多事情发生,所以是的,我需要等待这么久。
var casper = require('casper').create();
casper.start('mysite.html', function() {
});
casper.then(function() {
result = getSomethingFromMyServerViaAjax( theId );
});
这是我尝试过的替代方法,似乎总是等待3分钟,无论ajax调用回来的速度如何。
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只是跳过那个阻塞并且每次都继续运行。
答案 0 :(得分:2)
你快到了。您需要触发长时间通话。它似乎是同步的所以我把它放在setTimeout
里面。结果在一段时间后写入window.resultFromMyServerViaAjax
。
this.evaluate
也是同步的,但在执行之后,会调度wait
步骤并定期测试是否设置了窗口属性。
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();