如何使用Java在Selenium WebDriver中执行鼠标悬停功能?

问题

我想在下拉菜单中执行鼠标悬停功能。当我们将鼠标悬停在菜单上时,它会显示新选项。我尝试使用xpath单击新选项。但无法直接单击菜单。所以,作为我试图将鼠标悬停在下拉菜单上的手动方式,然后将单击新选项。

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

#1 热门回答(89 赞)

它实际上不可能执行"鼠标悬停"操作,而是需要将你想要一次完成的所有操作链接起来。因此,移动到显示其他元素的元素,然后在同一个链中,移动到现在显示的元素并单击它。

使用Action Chains时,你必须记住"像用户那样做"。

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).moveToElement(webdriver.findElement(By.xpath("/expression-here"))).click().build().perform();

#2 热门回答(44 赞)

尝试执行以下操作时,这些答案都不起作用:

  • 将鼠标悬停在菜单项上。
  • 找到悬停后仅可用的隐藏元素。
  • 单击子菜单项。

如果在moveToElement之后插入'perform'命令,它会移动到元素,子菜单项会显示一段时间,但这不是悬停。隐藏元素会在找到之前立即消失,从而导致ElementNotFoundException。我尝试了两件事:

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
builder.moveToElement(clickElement).click().perform();

这对我不起作用。以下对我有用:

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
By locator = By.id("clickElementID");
driver.click(locator);

使用操作悬停和标准WebDriver单击,我可以悬停然后单击。


#3 热门回答(20 赞)

基于thisblog帖子,我能够使用Selenium 2 Webdriver使用以下代码触发悬停:

String javaScript = "var evObj = document.createEvent('MouseEvents');" +
                    "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);" +
                    "arguments[0].dispatchEvent(evObj);";


((JavascriptExecutor)driver).executeScript(javaScript, webElement);