从Evaluate CasperJS中发出事件

时间:2013-07-16 17:47:38

标签: casperjs

我在抓取网站时从我正在创建的网址下载文件时遇到问题。目前,我发现文件的月份和年份,然后替换网址中的值并下载尝试从该位置下载。据我所知,您无法在评估范围内使用下载功能。

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);
});

无论如何从评估中发出自定义事件?我不想离开我当前的页面,或者必须从评估范围来回走动。我知道我可以返回一个网址列表并在事后处理它们,但如果可能的话,我很好奇。谢谢你的帮助。

2 个答案:

答案 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()

访问