2016-02-28 59 views
7

我使用PhantomJS 2點擊頁面的元素。但是,我不知道點擊這些元素是否會觸發事件(例如,頁面加載)。PhantomJS 2:檢測沒有觸發事件的點擊

我希望能夠處理這兩種情況下:

  1. 當一個元件上的點擊觸發頁面加載,然後我想等到新的頁面已經被加載。

  2. 當點擊不觸發事件時,我希望能夠識別(無需等待很長的超時)。

PhantomJS 1,我可以簡單地使用一個封閉件的這樣的:

function click(page, elem, callback) { 
    var loading = false; 

    page.set('onLoadStarted', function() { 
    loading = true; 
    }); 

    page.set('onLoadFinished', function() { 
    callback('click triggered page load'); 
    }); 

    triggerClick(page, elem); 

    setTimeout(function() { 
    if (! loading) { 
     callback('click did not trigger page load'); 
    } 
    }, 100); 
} 

在這裏,我閉在loading可變其充當之間的「通信信道」事件處理程序和函數setTimeout

  1. 萬一點擊觸發網頁加載時,onLoadFinished處理程序將調用回調的頁面加載後。

  2. 如果點擊不觸發頁面加載,setTimeout中的函數將在100ms(這是可接受的)後調用回調函數。

此代碼已被PhantomJS下工作井1

在PhantomJS 2遺憾的是,對於onLoadStartedonLoadFinished事件處理程序不能訪問的loading變量(即他們不工作的關閉了,因爲它似乎)。

所以現在我想知道我如何能夠在PhantomJS 2中實現相同的行爲。任何想法?

PS:我知道,我必須通過page.property(...)在PhantomJS 2安裝,而不是使用page.set(...)像的事件處理程序PhantomJS 1

編輯:我使用的節點包幻象(https://www.npmjs.com/package/phantom)作爲節點& phantomjs之間的橋樑。

+0

沒有'page.set'在PhantomJS(1或2)。你在node.js和PhantomJS之間使用某種橋樑嗎? –

+0

嗯,是的確 - 我正在使用節點軟件包phantom(https://www.npmjs.com/package/phantom)。顯然忘了提及;)。但是,我想知道在哪種方式可能會涉及到我上述問題的解決方案...這實際上是這個節點橋而不是phantomjs本身的問題嗎? – Oliver

回答

0

對我來說,解決方案實際上是放棄節點橋,而是使用純粹的phantomjs。這導致以下相應的代碼的工作象一個魅力,即使PhantomJS 2

function click(page, elem, callback) { 
    var loading = false; 

    page.onLoadStarted = function() { 
    loading = true; 
    }; 

    page.onLoadFinished = function() { 
    callback('click triggered page load'); 
    }; 

    triggerClick(page, elem); 

    setTimeout(function() { 
    if (! loading) { 
     callback('click did not trigger page load'); 
    } 
    }, 100); 
}