这让我发疯,我只需要 WebDriver 右键单击一个元素,我的其余 selenium 就可以工作了。
我正在使用 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:contextMenu。
有一个元素在右键单击该行之前不会被视为“可见”。它被检测为存在,但 selenium 不会运行它,除非我在 WebDriver 中运行时手动右键单击它以使其可见。否则,它只会给我这个:
com.thoughtworks.selenium.SeleniumException:元素当前不可见,因此可能无法与之交互。
右键单击该行使元素“可见”,这就是为什么我非常需要 Selenium 右键单击。我已经测试过以确保不可见元素被检测为存在,确实如此。
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 作为右键单击的替代,但效果不佳。
这一切在 Selenium IDE 中都工作得很好,但我需要它与 WebDriver 一起工作,这样我就可以在 Java 中处理它。请帮帮我。
编辑:感谢 Slanec 的建议以及对操作构建器的更多修改,我发现这是我的 selenium webdriver 没有更新到 Firefox 14 的问题。考虑到我以为我已经下载了最新的,这很奇怪就在上周四。不管怎样,显然直到 webdriver 2.25.0 才添加了对 Firefox 14 的 native 事件支持,而我正在使用 2.24.1。
最佳答案
不幸的是,当查看at the source code时,contaxtMenu()
方法尚未添加到 WebDriver 模拟中。它甚至不存在于 org.openqa.selenium.internal.seleniumemulation
中。所有其他方法(通过命令模式伪装的类)所在的包。它很可能没有向后移植到 WebDriverBackedSelenium
当它被引入时(Selenium RC 已被弃用,并且不在积极开发中,还记得吗?)。
你可以尝试的事情:
如果还可以的话,摆脱 Selenium RC。 WebDriver API 更加干净、强大并且开发积极:)。要使用 WebDriver 来做到这一点,您需要这样做
WebElement elem = driver.findElement(By.xpath("//tr[@id[contains(.,'Equipment')]]")); new Actions(driver).contextClick(elem).perform();
尝试使用您创建的 WebDriver 对象执行此任务,然后再次使用 Selenium。上面的两行代码只要放在 Selenium 代码之间就应该可以工作。
自己实现。这并不难。只要看看
org.openqa.selenium.internal.seleniumemulation
包和WebDriverCommandProcessor
类,添加contextMenu()
方法如上所述。这意味着从编辑的源代码中创建您自己的 Selenium 版本,但是嘿,为什么不呢。最后的手段 - 弄清楚隐藏元素正在等待什么操作并通过
fireEvent()
模拟事件方法。执行以下操作应该可以解决问题(如果没有,它只是在等待不同的事件):fireEvent("//tr[@id[contains(.,'Equipment')]]", "contextmenu")
作为旁注,而不是长篇文章
"//tr[@id[contains(.,'Equipment')]]"
或者好一点
"//tr[contains(@id,'Equipment')]"
你可以这样写:
"css=tr[id*='Equipment']"
这不是更好看、更易读吗?我对 XPath 也很满意,但是学习一些基本的 CSS 选择器(它可以做大部分事情,但绝对不是所有 XPath 都能做)并不是那么可怕......
关于java - 无法右键单击,Java Selenium WebDriver java.lang.UnsupportedOperationException : contextMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11588145/