2012-07-20 73 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

相关问题