首先,您可以將值傳遞給遠程頁面的上下文(即到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
:
this.wait(
1000, // in ms
function() {
this.evaluate(function(remoteCount) {
nextPage(remoteCount);
}, count);
}
);
[EDIT ADDED]下列電子通風口監聽器將幫助您調試。
// 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));
});
非常感謝你的代碼sudipto。我幾乎在那裏,只有一個奇怪的問題。它適用於每一頁,但第二個。看起來nextPage函數在評估函數的第一次迭代中有一個空值?我不確定發生了什麼事。但這裏是代碼: http://pastebin.com/QJvA2nap 和這裏的輸出:http://pastebin.com/kKZHiLKM – Joe
好的。首先添加這兩個事件監聽器: '//幫助正在跟蹤頁面的console.log casper.on('remote.message',function(msg){ console.log('[Remote Page]'+ msg); (「page.error」,函數(msg,trace)){casper.echo(「[Remote Page Error]」){ });' '{//打印出網頁中的所有錯誤消息 + msg,「ERROR」); casper.echo(「[Remote Error trace]」+ JSON.stringify(trace,undefined,4)); });' – sudipto
上述2個事件偵聽器將偵聽遠程頁面錯誤和console.log通過JS在遠程頁面中調用(你可以從'evaluate'函數中調用它,現在,在'evaluate'函數中,在寫入之前'return remoteCount;'添加這行'console.log(remoteCount);'。這將顯示直接從頁面收到的值。在這種情況下也是如此,我們需要深入挖掘。 – sudipto