2015-10-19 130 views
4

從帖子:How to ng-click an A directive in a PhantomJS test我明白我需要創建自己的函數來點擊元素,但是如何使用它?無法用Phantomjs點擊元素

下面的代碼給我錯誤TypeError: 'undefined' is not a function (evaluating 'click(obj)')

var page = require('webpage').create(); 
var url = 'http://somesite.com/document.html'; 

page.open(url, function(status) { 
    page.evaluate(function() { 
     var obj = document.querySelectorAll('button')[0]; 
     click(obj); 
    }); 
    console.log(page.content); 
    phantom.exit(); 
}); 


function click(el){ 
    var ev = document.createEvent('MouseEvent'); 
    ev.initMouseEvent(
     'click', 
     true /* bubble */, true /* cancelable */, 
     window, null, 
     0, 0, 0, 0, /* coordinates */ 
     false, false, false, false, /* modifier keys */ 
     0 /*left*/, null 
    ); 
    el.dispatchEvent(ev); 
} 

回答

1

我想通了這個問題。點擊正在被該網站的javascript繞過。幸運的是PhantomJS具有發送同樣作爲一個真正的用戶將在事件的SendEvent功能:通過PhantomJS; click an element

+0

最好不要複製內容。如果解決方案爲您工作,那麼最好確認重複。 –

0
page.evaluate(function() { 
     document.getElementById("login").click(); 
    }); 

沒有工作......沒有你是什麼意思?

+0

是什麼。點擊之間的差值(),然後單擊(OBJ)

var rect = page.evaluate(function() { return $('a.whatever')[0].getBoundingClientRect(); }); page.sendEvent('click', rect.left + rect.width/2, rect.top + rect.height/2); 

找到上述解決方案? – zoltar

+0

我改變了js函數的點擊 - 不是你的自定義函數。你聲明「...我明白我需要創建我自己的函數來單擊一個元素...」,這是不正確的,因爲我明白了。 – user1515791

+3

'element.click()'不總是工作。 –

4

PhantomJS有兩個上下文。只有通過page.evaluate()訪問的頁面上下文才有權訪問DOM並可觸發合成事件。由於您的click()函數使用document,因此需要在頁面上下文中運行。

page.evaluate()是沙盒,這就是爲什麼你不能簡單地使用外部定義的變量。您可能需要在頁面上下文中定義它們,或者需要以複雜的方式傳遞它們(因爲只有原始對象可以進出頁面上下文,函數不是原始對象)。

page.open(url, function(status) { 
    page.evaluate(function() { 
     if (typeof window.click !== "function") { 
      window.click = function(el){ 
       var ev = document.createEvent('MouseEvent'); 
       ev.initMouseEvent(
        'click', 
        true /* bubble */, true /* cancelable */, 
        window, null, 
        0, 0, 0, 0, /* coordinates */ 
        false, false, false, false, /* modifier keys */ 
        0 /*left*/, null 
       ); 
       el.dispatchEvent(ev); 
      } 
     } 
     var obj = document.querySelectorAll('button')[0]; 
     click(obj); 
    }); 
    console.log(page.content); 
    phantom.exit(); 
}); 

參考文獻:

+0

這很有用,我不再得到TypeError消息,但它不能解決問題,即它不會導致單擊該按鈕。我想知道是否有某種JavaScript點擊預防與我試圖點擊的頁面進行,是這樣嗎? – zoltar

+1

@zoltar點擊在PhantomJS中總是很棘手。你有沒有通過我鏈接的問題的解決方案?特別是,[這個答案](http://stackoverflow.com/a/24026636/1816580)幾乎總是有效。 –

+0

謝謝Artjom,這是適合我的解決方案。 – zoltar