我在抓取网站时从我正在创建的网址下载文件时遇到问题。目前,我发现文件的月份和年份,然后替换网址中的值并下载尝试从该位置下载。据我所知,您无法在评估范围内使用下载功能。
this.evaluate(function collectAllData (MONTHS) {
for (...) {
// Create url from page information ...
casper.emit('test.download', url, fileName);
}
}, MONTHS);
casper.on('remote.download', function processRemoteDownload(url, fileName) {
this.download(url, fileName);
});
无论如何从评估中发出自定义事件?我不想离开我当前的页面,或者必须从评估范围来回走动。我知道我可以返回一个网址列表并在事后处理它们,但如果可能的话,我很好奇。谢谢你的帮助。
答案 0 :(得分:1)
在evaluate
回调中使用
console.log("casper-event:add:[1234]");
然后就可以这样做(未经测试):
casper.on('remote.message', function(msg) {
if(msg.indexOf("casper-event:" == 0))
{
var event = msg.replace(/^casper-event:/, '').replace(/:.*$/, '');
var result = JSON.parse(msg.replace(/^casper-event:.*?:/, ''));
this.emit(event, result);
}
})
casper.on('add'........
答案 1 :(得分:0)
以下是我为DOMContentLoaded
所做的事情:
casper.then(function getDOMLoaded(){
this.evaluate(function(){
window.__DOMLoaded = false;
document.addEventListener("DOMContentLoaded", function(){
window.__DOMLoaded = true;
})
})
});
casper.waitFor(function check() {
return this.getGlobal('__DOMLoaded');
}, function then() { // step to execute when check() is ok
casper.echo("DOMContentReady in " + (Date.now()-start) + " ms", "INFO_BAR");
}, function timeout() { // step to execute if check has failed
casper.echo("DOMContentReady took longer than 10 seconds!")
}, 10000);
它设置一个全局变量,该变量在WebPage中通过evaluate
更新。然后我运行waitFor
尝试(10秒)检查window.__DOMLoaded
是否为真(但是,在casper中但未评估,可通过this.getGlobal()