java - 无法右键单击,Java Selenium WebDriver java.lang.UnsupportedOperationException : contextMenu

标签 java selenium webdriver contextmenu right-click

这让我发疯,我只需要 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 已被弃用,并且不在积极开发中,还记得吗?)。

你可以尝试的事情:

  1. 如果还可以的话,摆脱 Selenium RC。 WebDriver API 更加干净、强大并且开发积极:)。要使用 WebDriver 来做到这一点,您需要这样做

    WebElement elem = driver.findElement(By.xpath("//tr[@id[contains(.,'Equipment')]]"));
    new Actions(driver).contextClick(elem).perform();
    
  2. 尝试使用您创建的 WebDriver 对象执行此任务,然后再次使用 Selenium。上面的两行代码只要放在 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 都能做)并不是那么可怕......

关于java - 无法右键单击,Java Selenium WebDriver java.lang.UnsupportedOperationException : contextMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11588145/

相关文章:

java - java HashMap中的ConcurrentModificationException程序

c# - 使用 Selenium 拦截 Javascript 函数调用

python-3.x - Python Selenium 在网站上找不到 href

java - Selenium 化物-无效选择器 : Unable to locate an element with the xpath expression

java - HTTP响应错误java.lang.IllegalStateException : Could not execute method of the activity

java - 在 WebLogic 上添加服务器启动参数 -DUseSunHttpHandler=true

javascript - Webdriver:Google 快讯选项的自动化

java - 尝试获取 url 的内容时抛出 Selenium WebDriver Java RunTimeException

java - 当我有 "Failed to scan[...]"警告时,如何在我的 spring boot 应用程序中处理 JAR 扫描?

python - 关闭 Selenium 中的通用弹出窗口