首先,您可以将值传递给远程页面上下文(即thenEvaluate
像这样运行:
this.thenEvaluate(function(remoteCount) {
nextPage(remoteCount);
}, ++count);
但是,Casper#repeat
在这里使用可能不是一个好的函数,因为循环不会等待每个页面加载然后捕获内容。
您可能宁愿设计一个基于事件的链接。
代码的工作流程是:
有一个全局变量(或至少一个可供下面提到的函数访问的变量)来存储count
和limit
.
收听load.finished
事件并在此处获取 HTML,然后调用下一页。
简化的代码可以是:
var casper = require('casper').create();
var limit = 5, count = 1;
casper.on('load.finished', function (status) {
if (status !== 'success') {
this.echo ("Failed to load page.");
}
else {
this.echo(this.getHTML());
this.echo('-------------------------');
}
if(++count > limit) {
this.echo ("Finished!");
}
else {
this.evaluate(function(remoteCount) {
nextPage(remoteCount);
// [Edit the line below was added later]
console.log(remoteCount);
return remoteCount;
}, count);
}
});
casper.start('http://www.example.com').run();
注意:如果您的页面具有高负载的 JS 进程等,您可能还需要wait
在调用 nextPage 之前添加一个:
this.wait(
1000, // in ms
function () {
this.evaluate(function(remoteCount) {
nextPage(remoteCount);
}, count);
}
);
[编辑添加] 以下事件侦听器将帮助您调试。
// help is tracing page's console.log
casper.on('remote.message', function(msg) {
console.log('[Remote Page] ' + msg);
});
// Print out all the error messages from the web page
casper.on("page.error", function(msg, trace) {
casper.echo("[Remote Page Error] " + msg, "ERROR");
casper.echo("[Remote Error trace] " + JSON.stringify(trace, undefined, 4));
});