2014-04-04 166 views
7

有沒有辦法顯示當前光標位置或類似的東西?我有一個應該點擊某個對象上的確切點的動作鏈,但我想我已經找到了錯誤的座標。我使用Firefox webdriver。 這裏的腳本的樣子:在Selenium中顯示當前光標位置

from selenium import webdriver 
import time 
from selenium.webdriver.common.action_chains import ActionChains 

driver = webdriver.Firefox() 
driver.get("http://www.mysite/") 
elem = driver.find_element_by_xpath('//div[@id="player"][1]/object[@type="application/x-shockwave-flash"]') 
action_chains = ActionChains(driver) 
action_chains.move_to_element_with_offset(elem, 660, 420).perform() 
action_chains.click().perform() 
time.sleep(10) 
driver.close() 
+1

這是一個非常糟糕的做法。只要將此端口移植到其他瀏覽器/計算機/等等,就很可能會遇到問題。幾乎總是有一種方法可以在不使用鼠標的情況下進行客戶端操作,即使這是唯一方法,仍然應該有一個不使用光標位置的方式。如果這是唯一的方法,那麼只有當瀏覽器窗口被設置爲特定大小時,才能夠單擊該元素。如果您提供您嘗試訪問的網站的網址,那麼我可能會找到一種更好的方式讓您實現您正在嘗試的操作... –

+0

@barakmanos感謝您的評論。不幸的是,我沒有其他方式可以在頁面上使用該對象。例如,假設我想在http://www.jwplayer.com/上啓動視頻並更改其分辨率,但不使用其API。 –

+0

我同意barak manos,一般情況下你不想這樣做,但是我發現你試圖點擊flash player。我不知道任何通過控制瀏覽器(像Selenium一樣)操作的解決方案,它不依賴於使用座標來執行此測試。然而,也許有測試解決方案設計的閃存,將能夠找到像Selenium能夠找到Flash元素的元素? – Louis

回答

0

我沒有看到直接改變分辨率,因爲我們不能使用任何定位這方面的任何可能的方法。

對於您的JWPlayer示例,我相信可能會有一些javascript代碼段允許更改分辨率。使用Selenium JavascriptExecutor,你可以運行該javacript代碼來模擬分辨率的變化..雖然不是通過點擊光標。

WebDriver driver = new ChromeDriver(); 

if (driver instanceof JavascriptExecutor) { 
    ((JavascriptExecutor) driver).executeScript(YOUR_JAVA_SCRIPT_STRING); 
} 

我注意到你提到你不想使用任何本機JWPlayer API。我認爲這是唯一可能的解決方案。

0

作爲一個硒新手理解它只是不能生成點擊Flash對象是有點困難。我在這裏看到的唯一可能的解決方案是使用sikuli-script

我在GitHub上找到了該項目:https://github.com/kevlened/sikuli_cpython。它允許在純python中使用sikuli腳本(用jython編寫),所以我想我可以編寫一些sikuli腳本並將它們與硒測試集成在一起。

-2

可以使用下一個方法找到你的位置:

WebDriver.get_window_position() 
+0

不幸的是,這返回窗口位置而不是光標位置。 – kiminoa

4

我有一個不透明的HTML5畫布,我曾在各種偏移檢查提示的價值觀,什麼麻煩!經過大量的敲我的頭,我學到了一些重要的東西:

  1. move_to_element_by_offset有之前2.42的問題。另請參見https://code.google.com/p/selenium/issues/detail?id=4215

  2. 即使在更新後,move_to_element_by_offset仍然會出現問題。我切換到ActionChains move_to_element懸停(默認爲元件的中心)和第二ActionChainsmove_by_offset

  3. 的組合現在您在位置,重新請求該位置敏感元件是。在我的情況下,這是一個工具提示對象。這selenium.webdriver.remote.element將有你需要的.location['x'].location['y']成員來理智地檢查你的位置。不爲perform後抓住光標位置工作

事情倒是ActionChain徘徊,節省大家一段時間:

  • .location['x'].location['y']你進入move_to_element的元素。這些值不會被ActionChains更新。
  • selenium.webdriver.remote.webdriverswitch_to_active_element;我不清楚哪些元素符合「主動」的要求,但它不會將我們的工具提示作爲有效元素進行確認,並將[0,0]座標返回給我。
  • selenium.webdriver.remote.webdriverget_window_position;該文檔有點含糊,但這只是功能所暗示的:一個窗口而不是一個光標位置。
相關問題