使用Java不稳定

时间:2016-11-23 15:41:37

标签: java selenium selenium-webdriver

我使用Selenium 3.0.1使用TestNG运行自动化测试。 在一个测试中,我试图将鼠标悬停在操作菜单上,然后单击该菜单中的选项:

Actions builder = new Actions(getWebDriver());
builder.moveToElement(actionButton).build().perform();

但测试不稳定。我可以看到菜单打开但是立即关闭,因此测试失败,因为它不再找到该选项。 我收到此错误:

java.lang.IllegalArgumentException: Must provide a location for a move action.
at org.openqa.selenium.interactions.MoveMouseAction.<init>(MoveMouseAction.java:30)
at org.openqa.selenium.interactions.Actions.moveToElement(Actions.java:251)

如何查看菜单是否已打开? perform()方法返回void。 我注意到我调用moveToElement两次,而不是测试更稳定。这样做有什么优雅的选择吗?

Actions builder = new Actions(getWebDriver());
builder.moveToElement(actionButton).build().perform();
builder.moveToElement(actionButton).build().perform();

当我们将鼠标悬停在菜单上时菜单的外观如下: hover over menu

我发现了这个问题: https://sqa.stackexchange.com/questions/3467/issue-with-losing-focus-of-hover-command-when-the-mouse-is-outside-of-the-acti 这最能解释我的问题。不幸的是,仍然没有解决方案。

3 个答案:

答案 0 :(得分:1)

如果您没有必要打开菜单,请尝试使用JavascriptExecutor单击该选项。 JavascriptExecutor也可以单击一个隐藏元素,使用JavascriptExecutor触发点击所需的一切就是该元素存在于DOM上。

Snippet(Java):

<group extend="0" string="Group By">
    <filter name="attachment_type" string="attachment Type" context="{'group_by' : 'attachment_type'}"></filter>
    <filter name="state" string="Issue Status" context="{'group_by': 'state'}"></filter>
</group>

答案 1 :(得分:0)

您可以在悬停后使用FluentWait等待菜单显示,如下所示:

FluentWait<> wait = new FluentWait<>(getWebDriver())
            .withTimeout(driverTimeoutSeconds, TimeUnit.SECONDS)
            .pollingEvery(500, TimeUnit.MILLISECONDS)
            .ignoring(StaleElementReferenceException.class)
            .ignoring(NoSuchElementException.class)
            .ignoring(ElementNotVisibleException.class)

wait.until(x -> { return driver.findElement(menuElementBy); } );

如果鼠标悬停成功 - 菜单开始显示 - 没有理由你需要调用它两次。

答案 2 :(得分:0)

这似乎是一个时间问题。

如果菜单有过渡效果,则添加效果持续时间的延迟:

new Actions(driver)
  .moveToElement(menu)
  .pause(100) // duration of the transition effect in ms
  .perform();

submenu.click();

您还可以等待目标元素变得可见且稳定(同一位置连续两次返回)。