2012-07-20 106 views
2

這讓我瘋狂,我只需要WebDriver右鍵單擊一個元素,其餘的硒就可以工作。無法右鍵單擊,Java Selenium WebDriver java.lang.UnsupportedOperationException:contextMenu

我正在使用Eclipse,所有我的.jar導入和庫設置都正確。

WebDriver driver = new FirefoxDriver(); 
String baseUrl = "http://............/"; 
selenium = new WebDriverBackedSelenium(driver, baseUrl); 

在我的代碼很久以後,我的JavaScript的portlet行我想執行上沒有任何問題,用鼠標右鍵單擊左內點擊。

selenium.click("//tr[@id[contains(.,'Equipment')]]"); 

工作得很好,被點擊的行高亮顯示,就像它應該做的那樣。

現在我只需要右鍵單擊它,但我不能!嘗試:

selenium.contextMenu("//tr[@id[contains(.,'Equipment')]]"); 

無法用鼠標右鍵單擊,並返回我的錯誤:java.lang.UnsupportedOperationException:文本菜單。

有一個元素直到該行被右鍵單擊才被視爲「可見」。它被檢測爲存在,但硒將不會運行它,除非我在WebDriver中手動右鍵單擊它以使其可見。否則,它只是給了我:

com.thoughtworks.selenium.SeleniumException:元素當前不可見,因此可能不會與之交互。

右鍵單擊該行是使元素「可見」的原因,這就是爲什麼我需要使硒右鍵單擊非常糟糕。我已經測試過,以確保不存在的元素被檢測爲存在,它是。

boolean exists = selenium.isElementPresent("//a[@id[contains(.,'faction')]]"); 
boolean visible = selenium.isVisible("//a[@id[contains(.,'faction')]]"); 
System.out.println("Exists: " + exists); 
System.out.print("Visible: " + visible); 

給我

Exists: true 
Visible: false 

換句話說,這不是我的XPath的一個問題。在那。這只是不「可見」。我試過發送Shift + F10作爲右鍵點擊的替代品,這並不好。

這一切工作中硒IDE很好,但我需要它與webdriver的工作,所以我亂用它在Java中。請幫助我。

編輯:感謝Slanec的建議和更多與行動生成器搞亂,我發現這是我的硒webdriver不是最新的Firefox 14的問題。這很奇怪,考慮我以爲我已經下載了最新的就在上週四。無論哪種方式,直到webdriver 2.25.0,我都使用了Firefox 14的本機事件支持,而我使用的是2.24.1。

+0

看看這篇文章是否有助於http:// stackoverflow.com/questions/7647154/webdriver-contextclickwebelement-not-opening-the-context-menu – anazimok 2012-07-21 00:43:02

+0

唉,我已經試過了。我得到:線程「main」中的異常org.openqa.selenium.InvalidElementStateException:無法執行本地交互:無法加載本地事件組件。即使我有profile.setEnableNativeEvents(true);但當我嘗試使用動作進行操作時,它仍會給我那個錯誤。有沒有辦法讓Firefox停止關注某個元素是否隱藏? – Mike 2012-07-21 00:51:47

+0

是否有任何特殊的原因,您通過舊的Selenium界面使用新的WebDriver?在你必須支持之前,你是否繼承了一套測試套件,還是對舊格式感到滿意? – 2012-07-21 07:27:30

回答

2

不幸的是,看at the source code時,該​​方法還沒有被添加到仿真的webdriver。它甚至沒有出現在org.openqa.selenium.internal.seleniumemulation包中,其中所有其他方法(通過命令模式僞裝的類)都在其中。這是,最有可能的,而不是當它被引入回遷到WebDriverBackedSelenium(硒RC已被棄用,而不是在積極發展,還記得嗎?)。

事情你可以嘗試:

  1. 擺脫硒RC的,如果你還是可以的。 WebDriver API更加乾淨,功能強大,並且積極開發:)。要使用webdriver的做到這一點,你會做

    WebElement elem = driver.findElement(By.xpath("//tr[@id[contains(.,'Equipment')]]")); 
    new Actions(driver).contextClick(elem).perform(); 
    
  2. 嘗試這樣做只是這個任務與您創建,然後回落到再次使用硒的webdriver對象。上面的兩行代碼應該可能在Selenium代碼之間拋出時工作。

  3. 自己實施。這並不難。請看org.openqa.selenium.internal.seleniumemulation包和WebDriverCommandProcessor類,如上所述添加contextMenu()方法。這將意味着讓你自己的Selenium從編輯後的源代碼構建,但是,嘿,爲什麼不呢。

  4. 最後一招 - 弄清楚什麼樣的行動完全隱藏的元素在等待,並通過fireEvent()方法模擬事件。執行以下操作應該做的伎倆(如果不是,它只是在等待不同的事件):

    fireEvent("//tr[@id[contains(.,'Equipment')]]", "contextmenu") 
    

作爲一個側面說明,而不是長

"//tr[@id[contains(.,'Equipment')]]" 

或一點點更好

"//tr[contains(@id,'Equipment')]" 

你可以寫這個:

"css=tr[id*='Equipment']" 

它不是更好一些,更具可讀性嗎?我也很喜歡XPath,但是學習一些基本的CSS選擇器(它可以做到最多,但絕對是而不是所有的XPath都可以)不是那麼可怕......

+0

你好,謝謝你的CSS選擇器提示。我是硒的新手,幾天前剛開始使用硒,我一定會使用它。代碼很小,使用WebDriver API不是問題,事實上我都嘗試過。當我嘗試構建一個動作並讓它執行一個contextclick時,我會反而得到這個錯誤:'org.openqa.selenium.InvalidElementStateException:無法執行本地交互:無法加載本地事件組件。'即使我做了profile.setEnableNativeEvents(true);爲Firefox。我會在星期一上午首先測試你的建議,看看有沒有工作,謝謝。 – Mike 2012-07-21 18:35:58

0

可能是你可以嘗試selenium.contextMenuAt