2015-01-14 100 views
3

我越來越困惑,試圖找到一種方法在網頁瀏覽器窗口中發送左鍵點擊。我使用Selenium selenium-2.44.0和Python 2.7。我的最終目標是能夠點擊窗口中的某些區域,但現在我只想確保我可以點擊。我認爲點擊鏈接所在的區域是一個好主意,因爲那樣我就可以驗證點擊的確發生了(即,我將被帶到另一個html頁面)。用selenium 2(Python綁定)在網頁瀏覽器中點擊任意位置

所有先決條件都得到滿足,我能夠啓動瀏覽器並訪問和操作各種Web元素。根據我在幫助中找到的內容,應該使用move_by_offset方法將鼠標光標移動到某個方向。然而,當我運行代碼時,不會發生點擊(或者它發生,但url鏈接沒有被點擊並且沒有新的頁面打開)。我甚至無法驗證點擊是否發生。例如,在正常的瀏覽器會話中單擊註銷鏈接時,會發生註銷操作。

... 
homeLink = driver.find_element_by_link_text("Home") 
homeLink.click() #clicking on the Home button and mouse cursor should? stay here 
print homeLink.size, homeLink.location 

helpLink = driver.find_element_by_link_text("Help") 
print helpLink.size, helpLink.location 

action = webdriver.common.action_chains.ActionChains(driver) 
action.move_by_offset(150,0) #move 150 pixels to the right to access Help link 
action.click() 
action.perform() 

下面是我正在使用的網頁中區域的屏幕截圖。

enter image description here

的大小和元素的位置都印如下:

{'width': 39, 'height': 16} {'y': 47, 'x': 341} 
{'width': 30, 'height': 16} {'y': 47, 'x': 457} 

的頁面背後的HTML代碼如下,如果它是值得考慮的。

<a href="/web/">Home</a> 
| 
<a href="/web/Account/LogOff">Logout</a> 
| 
<a href="#" onclick="HelpFile.open();">Help</a> 

我知道,我可以通過尋找在很多方面的元素訪問該鏈接,但我試圖執行一個特定位置的點擊現在用的是鏈接元素只是爲了驗證點擊真的發生了。

如何執行點擊?

+0

您是如何計算150像素偏移量以訪問幫助鏈接的? – shri046

+0

@ shri046,我找到了Home鏈接的x座標和幫助鏈接之間的區別(在問題主體print element中)。我也通過使用MeasureIt插件來驗證Firefox。 –

+0

根據我的經驗,點擊總是發生在元素的中間(中間)。因此'homeLink.click()'可能會在home鏈接元素的x +(width/2)處有鼠標指針。在計算需要移至的結果偏移量時,您可能必須考慮這一點。 – shri046

回答

2

假設有什麼你的頁面上的其他事情,將與點擊干擾,這應該這樣做:

homeLink = driver.find_element_by_link_text("Home") 
homeLink.click() #clicking on the Home button and mouse cursor should? stay here 
print homeLink.size, homeLink.location 

helpLink = driver.find_element_by_link_text("Help") 
print helpLink.size, helpLink.location 

action = webdriver.common.action_chains.ActionChains(driver) 
action.move_to_element_with_offset(homeLink, 150, 0) #move 150 pixels to the right to access Help link 
action.click() 
action.perform() 

您應該使用move_to_element_with_offset如果你想鼠標位置是相對於一個元素。否則,move_by_offset相對於上一個鼠標位置移動鼠標。當您使用clickmove_to_element時,鼠標放置在元素的中心。 (該Java documentation這些是明確的。)

+0

嗨@路易斯,感謝您的幫助。我編輯了我的問題,指定我首先在主頁按鈕上提交單擊。它是否將鼠標光標放在主頁按鈕上?如果是這樣,那麼我希望move_by_offset將光標從主頁按鈕移到右側。我錯了嗎? –

+0

@AlexTereshenkov您是否嘗試過我編寫的代碼,並解決了這個問題?請注意,在得到像我這樣的答案之後,改變你的問題通常不是一個好主意,因爲它使得回答問題早期版本的人看起來好像他們沒有注意到你寫的內容。 – Louis

+0

我的編輯後,您的答案仍然有效,但我會記住您的筆記。您發佈的代碼確實有效,但無論指定哪個偏移量(例如500,500),它都會點擊幫助按鈕。我認爲我在問題中指定的另一件事是,我不知道要將鼠標光標移到哪個元素上。我只想從一個已知的位置移動150個像素,然後左鍵單擊而不知道它下面有什麼。幫助/主頁鏈接僅用於可視化和工作流驗證目的。 –

2

硬盤爲您確切的情況說,但我知道的解決方法,在總結和問題大膽

發送在Web瀏覽器窗口左側點擊一個具體的點

你只是使用execute_script,並做點擊使用JavaScript。

self.driver.execute_script('el = document.elementFromPoint(47, 457); el.click();') 

這是在緊要關頭方便,因爲你可以找到調試在瀏覽器中的元素通過打開控制檯並使用quearySelector座標(工程一樣的webdriver的通過。CSS_SELECTOR):

el = document.querySelector('div > h1'); 
var boundaries = el.getBoundingClientRect(); 
console.log(boundaries.top, boundaries.right, boundaries.bottom, boundaries.left); 

這就是說,編寫測試以點擊特定點是一個非常糟糕的主意。但是我發現有時甚至在el.click()或action chain不工作的情況下,執行腳本仍然可以使用querySelector,它與您在Selenium中所做的一樣好。

self.driver.execute_script('el = document.querySelector('div > h1'); el.click();') 
相關問題