2013-07-16 77 views
3

我在從網站下載文件時遇到問題,我在創建網站時報廢。目前我發現文件的月份和年份,然後替換網址中的值並下載試圖從該位置下載。我知道你不能在評估範圍內使用下載功能。從內部發射事件評估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); 
}); 

是否有無論如何發佈評估內的自定義事件?我不想離開當前頁面,或者不得不從評估範圍來回移動。我知道我可以返回一個網址列表並在事後處理它們,但是如果可能的話,我很好奇。謝謝你的幫助。

回答

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

它設置一個全局變量,它是在網頁中通過evaluate更新。

console.log("casper-event:add:[1234]"); 

:我然後運行一個waitFor它試圖(10秒),以檢查window.__DOMLoaded是否爲真(但是,卡斯帕內,但無法評估,這是通過evaluate回調內部this.getGlobal()

1

使用訪問然後可以做這樣的(未測試):

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'........ 
+0

這看起來清晰,大概可代替console.log'的',也有從[PHA本地'callPhantom' ntomjs文檔](https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage#onca​​llback)來實現類似的功能。 –