我当前的脚本看起来像这样(伪代码):
casper.start(some_sample_url, function(){
a_list_of_data = JSON.parse(this.getPageContent())
for(var i = 0; i < a_list_of_data.length; i++){
entry = a_list_of_data[i];
entry_url = entry.get_url();
result = __utils__.sendAJAX(entry_url, "POST", {some: "data"}, false, {some: "option"});
casper.download(result, ...);
}
});
casper.run();
我已经了解到__utils__.sendAJAX
应放在this.evaluate
中,而casper.then
应该放在POST
中。但是,在我将代码更改为该表单后,似乎所有{{1}}个请求都没有被发送出去。有人能指出我正确的方向吗?
答案 0 :(得分:0)
唯一的限制是__utils__
仅在页面上下文中定义/注入(casper.evaluate
内部)。所以你根本就不能在外面使用它。由于将false
作为第三个参数传递给__utils__.sendAJAX
会使其成为阻止调用,因此您可以在脚本中使用它。
for(var i = 0; i < a_list_of_data.length; i++){
entry = a_list_of_data[i];
entry_url = entry.get_url();
result = this.evaluate(function(){
return __utils__.sendAJAX(entry_url, "POST", {some: "data"}, false, {some: "option"});
});
casper.download(result, ...);
}
请注意,casper.download
被任意限制为30秒下载(硬限制)和仅几兆字节的数据。它实际上在幕后使用__utils__.sendAJAX
。
如果您期望二进制数据,则需要在从页面上下文返回字符串之前对其进行编码,并在casper上下文中对其进行解码。
所有casper.then*
和casper.wait*
函数都会创建一个步骤,该步骤将添加到步骤队列中并逐个执行。某些功能还会创建casper.repeat
,casper.start
,casper.run
等步骤。如果有一个名为then
或onTimeout
的回调函数,那就是一个步骤。
您要执行的所有代码必须至少具有一个步骤功能,否则将在控制流程之外执行。有一些策略可以赶上破损的控制流程。但这里不需要这些。