我使用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();
我发现了这个问题: https://sqa.stackexchange.com/questions/3467/issue-with-losing-focus-of-hover-command-when-the-mouse-is-outside-of-the-acti 这最能解释我的问题。不幸的是,仍然没有解决方案。
答案 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();
您还可以等待目标元素变得可见且稳定(同一位置连续两次返回)。