2016-04-05 75 views
1

我的html網頁有加載和動態應用樣式表的javascript。所有內容和呈現都發生在div標籤內。這不會加載具有id ='tagid'的div標籤的內容。你知道這裏有什麼問題嗎?我正在使用jquery函數來確保頁面被加載。但似乎page.evaluate甚至沒有被稱爲。使用phantomjs加載DOM

我正在使用phantomjs編寫單元測試。對幻影新來說。請參閱下面的代碼片段。

page.open(address, function(status){ 
    console.log('status '+status) 
    if(status=='success'){ 
     console.log('inside status if ') 
     page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js", function() { 
      console.log('after include js ') 
      page.evaluate(function(){ 
       console.log('inside evlaute ') 
       $(window).load(function(){ 
        console.log(document.getElementById("tagid").innerHTML) 

       }); 
      }); 

      setTimeout(function(){phantom.exit()},18000) 
     }) 
    } 
}) 
+0

頁面加載後調用'$(window).load(...)'沒有任何意義。回調將永遠不會被調用。 –

回答

0

您可以嘗試在給予評估前給予一些暫停。

window.setTimeout(function() { 
    page.evaluate(function() { 
     console.log(document.getElementById("tagid").innerHTML) 
    }); 
}, 1000 // adjust the time here 

要檢查哪些內容是phantomjs正在呈現,你可以使用page.content,並檢查是否有你的「標籤識別」元素確實存在。

+0

謝謝Artjom。看起來像tagid元素是存在的,但沒有內容可見phantomjs。但是,當我使用鉻開發工具加載頁面..我確實看到內容呈現。 tagid的內容在運行時在html中呈現。會發生什麼? – jack

1

您的代碼是正確的,但console.log調用默認沒有任何影響,因爲它發生在PhantomJS頁面的上下文中。

您可以使用evaluate調用的返回值如下:

page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js", function() { 
    console.log('after include js ') 
    var tagid = page.evaluate(function(){ 
    console.log('inside evlaute ') 
    return document.getElementById("tagid").innerHTML; 
    }); 

    console.log('Got tag ID: ' + tagId) 
    setTimeout(function(){phantom.exit()},18000) 
}) 

或者你可以選擇顯示由使用onConsoleMessage(更復雜的設置)登錄頁面的消息:

page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('PAGE CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
}; 

重要注意事項是PhantomJS和頁面的上下文是分開的:在evaluate調用中,不能訪問外部變量。事實上,在evaluate的回調之下,在給予page之前,將其轉換爲字符串。這是PhantomJS必須考慮的一個非常混亂的部分。

+0

謝謝blint。我試圖在評估函數中返回tagid。但是這似乎給了一些錯誤。控制檯輸出如下:------------------------------------------- 後狀態成功 內部狀態,如果包括JS 類型錯誤:空不是一個對象(評價 '的document.getElementById( 「標籤識別」)的innerHTML。') 未定義:2 :3 -------- ------------------------------------------ – jack

+0

看起來你沒有任何元素在您的頁面中(在評估=頁面加載完成後)標識'tagid'。如果稍後由腳本呈現此元素,則可以使用'setInterval'定期檢查何時將'#tagid'附加到DOM,然後再繼續執行下一步。 – blint