Selenium Webdriver 的鼠标悬停功能不适用于 Opera 39,并且与 Chrome 53 不一致

Mouseover function with Selenium Webdriver does not work with Opera 39 and works inconsistently with Chrome 53

我正在尝试编写 Webdriver 测试,我需要将鼠标光标悬停在某个元素上以触发下拉菜单,然后单击下拉菜单中的按钮。我一直在按照 How to perform mouseover function in Selenium WebDriver using Java? 的建议编写代码。因此,例如,我的代码可能如下所示:

Actions action = new Actions(webdriver);
WebElement hoverElem = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
WebElement clickElem = webdriver.findElement(By.xpath("//html/body/div[3]/li[12]/a"));
action.moveToElement(hoverElem).moveToElement(clickElem).click().build().perform();

我的代码 运行 在 Firefox 中测试时完美无缺,但在 Chrome 中却不一致;有时它会完美运行,然后下一次我 运行 测试它会失败。在歌剧中它永远不会起作用。当代码失败时,下拉菜单看起来会在屏幕上出现一瞬间,然后在 WebDriver 可以单击下拉菜单上的按钮之前消失。我不确定如何解决这个问题。我怎样才能让它与所有 3 种浏览器一起使用?

作为参考,我使用的是 selenium-2.53.0、Chrome 53.0.2785.101 64 位和 Opera 39.0.2256.71 64 位。

以防将来有人发现此问题并对为什么鼠标悬停功能与 Chrome、Opera 或 Internet Explorer 的工作不一致感到困惑,原因如下:

我上面的代码是正确的。问题是无论出于何种原因,如果鼠标光标位于浏览器 window 而测试是 运行ning(这这些浏览器的驱动程序中可能存在问题)。

要解决此问题,您需要确保在 运行 测试时鼠标光标位于浏览器之外 window。我通过在最大化浏览器 window 时在屏幕底部留下一两个 space 像素,然后使用 java.awt.Robot class 移动鼠标光标来做到这一点鼠标不会干扰测试的屏幕底部。

以下是我的显示器示例(1680 x 1050,所以我在屏幕底部留下了 40 个 space 像素):

    driver.manage().window().setPosition(new Point(0, 0));
    org.openqa.selenium.Dimension d = new org.openqa.selenium.Dimension(1680, 1010);
    driver.manage().window().setSize(d);

要将光标移开:

    Robot robot = new Robot();
    robot.mouseMove(0, 1050);

无论出于何种原因需要将鼠标光标重置到底部,您都可以调用上面的方法。