2015-09-15 46 views
2

我在Mac OS X Yosemite上使用PhantomJS。在PhantomJS中,在調用page.evaluate()之前,page.switchToFrame(k)是否需要延遲才能識別新框架的文檔?

的邏輯很簡單:

  1. 下載與框架一些HTML頁面。
  2. 切換到每個框架並確定它是否包含一些HTML元素。

下面的代碼片段,其中我切換到每個幀:

for (var k = 0; k < page.framesCount; ++k) { 
    page.switchToFrame(k); 
    var eventHeaderFound = page.evaluate(function() { 
     var eventArr = [].filter.call(document.querySelectorAll("tr.twSimpleTableHeadRow th[scope='col']"), function(el) { 
     if (typeof el == 'undefined') { 
      return false; 
     } 
     return el.textContent.trim() == "Event"; } 
    ); 
     return eventArr.length > 0; 
    }); 

似乎第一行中page.evaluate()函數(在那裏計算eventArr),常導致該錯誤:

TypeError: undefined is not a constructor (evaluating 'this.each(function(A,z){if(y.call(x,A,z)){w.push(A)}})') 
    http://25livepub.collegenet.com/hash860B52FC5686DB189F1B18561705DAD0/scripts/prototype.js:2 in h 

    phantomjs://webpage.evaluate():2 
    phantomjs://webpage.evaluate():9 

插入一些日誌指令(其中,在頁面的上下文,不寫處理標準輸出)後,這個錯誤有時會自行消失。在page.evaluate()上下文中的幀document變量可用之前是否需要page.switchToFrame之後是否有延遲?

這樣的事情一定會發生。有時候,邏輯起作用;其他時間沒有。我已經在瀏覽器中確認資源/ URL是及時提供的,所以網絡延遲不是問題。

+0

「未定義不是構造函數」出現了很多。嘗試添加換行符到您的eventArr構建代碼以獲取更具體的錯誤信息。 – dandavis

回答

1

不,page.switchToFrame()是同步/立即的。

我懷疑問題是您試圖訪問不存在的框架。調用switchToFrame()後兩次將切換到主框架的子框架的子框架。您需要在迭代結束時使用page.switchToParentFrame()切換回主/父框架。

+0

這有幫助。邏輯現在一直在工作。然而,同樣的錯誤現在仍然存在。我將修改原始帖子,以便您可以看到完整的錯誤。 –

相關問題