2014-02-25 64 views
1

我是新的Java腳本,我需要幫助:) 我想調用函數(set_calendar_date()),然後獲取頁面innerHTML。調用函數PhantomJs

<a onclick="set_calendar_date('1'); return false;" href="#"> 

<span> 

    26/02 We 

</span> 

PhantomJs代碼:

page.open(url, function (status) { 
if (status !== 'success') 
{ 
      console.log('Unable to access network'); 
    } 
else 
{ 
    var events = page.evaluate(function() { 
      // here i want to call set_calendar_date(); 
      return document.getElementById('fs').innerHTML; 
     }); 
    var file= require('fs'); 
    file.write('results.txt',events,'w+'); 

phantom.exit(); 
}}); 

回答

1

看來,當執行將通過AJAX加載內容或做一些處理,生成內容的功能set_calendar_date。此內容將放置在某處,可能位於編號爲fs的元素內。

考慮到這個過程的異步特性,你不能直接返回innerHTML在調用該函數後(你可能會得到舊數據或根本沒有)。

我的建議是調用函數內部評估

page.evaluate(function() { 
     set_calendar_date('1'); 
    }); 

接下來,你需要了解「更新」的性質。找到一個能以編程方式幫助確定更新是完成還是尚未完成的元素。舉例來說,如果的編號爲fs的元素爲空,則內容尚未更新。

然後繼續檢查目標元素(vis,fs)的變化。您可以繼續使用window.setInterval進行檢查。

代碼可以是類似於:

page.evaluate(function() { 
    set_calendar_date('1'); 
}); 

var waiter = window.setInterval(function(){ 
    var fsContent = page.evaluate(function(){ 
    var elm = document.getElementById('fs'); 
    return elm && elm.innerHTML || false; 
    }); 
    // if content is found 
    if (fsContent !== false) { 
    window.clearInterval(waiter); 
    var file= require('fs'); 
    file.write('results.txt',fsContent,'w+'); 
    } 

}, 300); 

注:這可以通過簡單的代碼使用CasperJS實施,圍繞PhantomJS的包裝。 CasperJS提供了許多功能可以很容易地完成這項工作,如使用waitForSelectorTextChange()waitFor()waitForSelector()waitWhileSelector()等。