2014-06-20 103 views
4

我在Windows 8.1上使用PhantomJS 1.9.7,我將在輸入用戶名和密碼後點擊登錄按鈕。我可以寫用戶名和密碼,但是當我想讓PhantomJS點擊按鈕時,它可以找到該元素,但無法點擊該元素。 我在之前的文章中發現我需要創建事件並使用「dispatchEvent」。我這樣做,但我如下得到了一個錯誤:PhantomJS無法點擊現有元素

TypeError: 'undefined' is not a function (evaluating 'elm.dispatchEvent(event)')

我也試圖從事件監聽得到幫助,但我得到了同樣的錯誤了點。

我怎樣才能點擊一個元素?

var page = require('webpage').create(); 

page.open('URL', function() { 
    var submitButton = enterUserAndPassAndLogin();  
    click(submitButton); 
    phantom.exit(); 
}); 

function enterUserAndPassAndLogin() { 
    var element = page.evaluate(function() { 
     document.querySelector('input[name="username"]').value = "*******"; 
     document.querySelector('input[name="password"]').value = "*******"; 
     return document.getElementsByTagName("Button"); 
    }); 
    return element; 
} 

function click(elm) { 
    var event = document.createEvent("MouseEvent"); 
    event.initMouseEvent("click", true, true, window, 
     0, 0, 0, 0, 0, false, false, false, false, 0, null); 
    elm.dispatchEvent(event); 
} 
+0

你會寫你使用點擊按鈕的代碼? –

+0

@cracker:請不要使用[內嵌代碼跨度突出顯示單詞](http://meta.stackexchange.com/questions/135112/inline-code-spans-should-not-be-used-for-emphasis-正確) - 往往沒有必要,如果真的需要強調,請[使用粗體或斜體](http://www.etf.europa.eu/authorssite.nsf/Pages/Use%20of%20bold%20and%20italics )代替。內聯代碼跨度僅用於語句中的代碼(顧名思義):編輯帖子時請記住這一點。 –

+0

當然,謝謝我下次會照顧 – cracker

回答

-1

jQuery中只需插入並做

$(selector).trigger('click'); 

請注意,如果該頁面使用異步後,頁面加載事件不會觸發,但它「加載」,你必須等待爲迴應。

可能會設置等待幾秒鐘,這將足以讓異步帖子回來。

+0

只是建議「用jQuery來代替!」沒有解決OP所具有的特定問題。 –

+0

親愛的@sphanley:只需注意:海報說:dispatchEvent是未定義的。 Jquery有這個方法。當然。 – Sesertin

+0

是的,但這就像告訴某人要求幫助讓他們的車開始換乘公共汽車。當然,jQuery可以觸發一個元素的點擊,但OP使用的是PhantomJS,而不是jQuery。 –

0

代碼有兩個問題。第一個DOM元素不能從頁面上下文(page.evaluate)之外傳遞。從docs相應行:

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

Closures, functions, DOM nodes, etc. will not work!

所以submitButton[null]。由於返回數組,錯誤消息不會顯示實際問題。由於DOM元素無法傳遞到外部,因此點擊必須發生在page.evaluate之內。

由於page.evaluate是沙盒,所以click函數必須在頁面上下文中定義。來自外部的變量和函數不能直接訪問。

一個可能的腳本是這樣的:

var page = require('webpage').create(); 

page.open('URL', function() { 
    enterUserAndPassAndLogin(); 
    setTimeout(function(){ 
     // wait a little to maybe see the click result 
     phantom.exit(); 
    }, 1000); 
}); 

function enterUserAndPassAndLogin() { 
    page.evaluate(function() { 
     function click(elm) { 
      var event = document.createEvent("MouseEvent"); 
      event.initMouseEvent("click", true, true, window, 
       0, 0, 0, 0, 0, false, false, false, false, 0, null); 
      elm.dispatchEvent(event); 
     } 
     document.querySelector('input[name="username"]').value = "*******"; 
     document.querySelector('input[name="password"]').value = "*******"; 
     click(document.getElementsByTagName("Button")[0]); 
    }); 
}