问题 如何使用selenium webdriver将鼠标悬停在一个不可见的元素上?


我的HTML页面上有一个不可见的元素,当在元素上完成鼠标悬停时,该元素变为可见。我要做的是

  1. 将鼠标悬停在元素上
  2. 单击元素(它将显示4个选项)
  3. 单击其中一个选项

我正在使用Java API for selenium web驱动程序,以下是我一直在尝试的

Actions builder = new Actions(driver);
builder.moveToElement(MainMenuBTN).click().build().perform();

subMenuBTN.click();
  1. MainMenuBTN =悬停鼠标时变为可见的元素 超过它
  2. subMenuBTN =从菜单选项中选择的元素 显示的

发生的事情是,MainMenuBTN上的click()正在生成ElementNotVisible异常。 我试着遵循以避免这种情况,但没有奏效。

Actions builder = new Actions(driver);
builder.moveToElement(mainMenuBTN).build().perform();
builder.click();

subMenuBTN.click();

注意:mainMenuBTN和subMenuBTN是由WebElements生成的

driver.findElement(By.xpath("xpath_string"))

我错过了什么吗?帮助赞赏!


4466
2017-10-17 00:11


起源

你找到了解决方法吗?对于我下面的代码工作: WebElement menu = driver.findElement(by); Actions builder = new Actions(driver); builder.moveToElement(menu).build().perform(); WebDriverWait wait = new WebDriverWait(driver, 15); 显示子菜单后,我使用id找到元素并单击它。不幸的是,这适用于FF 25和Selenium 2.42.2。当我升级FF时,它无法按预期工作。 - ldevp


答案:


使用javascript执行器之类的

((JavascriptExecutor) webdriver).executeScript("document.getElementById('btn').click();");

7
2017-10-17 00:17



谢谢回复!在哪里使用?单击悬停在元素上还是单击列表中显示的下一个元素? - MePunekar
您可以随时使用上面的代码,即使元素不可见,它也能正常工作。 - Amareswar
除了使用JavaScript之外的任何其他选项?另外请注意,你能告诉我上面java代码中的错误/问题是什么吗? - MePunekar
上面的javascript可能在我的场景中不起作用,因为元素只能由xPath而不是ids访问。 Ids是动态生成的,因此不会用于定位元素 - MePunekar
但这只是点击隐藏的网址或链接。鼠标悬停时未打开下拉菜单。我需要打开菜单鼠标 - vijay chouhan


好吧,经过多次问题并多次改变我的答案后,我会去 -

问题 - 我从原始代码得到的 -

您需要将光标移动到mainMenuBTN(当鼠标悬停在其上时,可以看到不可见的元素),然后显示需要单击的subMenuBTN。

根据我的原样,对原始代码的唯一编辑将添加一个语句,以便在单击它之前将光标移动到subMenuBTN。当我需要单击子菜单项时,这种方式对我来说很好。

Actions builder = new Actions(driver);
builder.moveToElement(mainMenuBTN).build().perform();
builder.moveToElement(subMenuBTN).build().perform();
subMenuBTN.click();

如果是这种情况,请告诉我。


5
2017-10-17 11:39



谢谢回复。上面的代码在“subMenuBTN.click();”中给出了ElementNotVisible异常。此外,我需要悬停并单击mainMenuBTN以获取列表,我可以从中单击特定的subMenuBTN。我不确定build()。perform()是否会实际点击mainMenuBTN。 - MePunekar
build().perform() 不会点击mainMenuBTN。但为什么你需要悬停在mainMenuBTN ???你不能直接点击它吗? - some_other_guy
不幸的是,我无法点击主菜单按钮。悬停在事件上会激活按钮,然后我需要单击该按钮以打开子菜单。 - MePunekar
@Some_other_guy - 即使我遇到了这个问题。您的解决方案有效 - Saurabh


您的“动作”构建器对我来说略显错误。这是我使用的一个例子:

public static void mouseClickByLocator( String locator ) {    
  WebElement el = driver.findElement( By.cssSelector( locator ) );    
  Actions builder = new Actions(driver);    
  builder.moveToElement( el ).click( el );    
  builder.perform();    
}

3
2017-12-29 05:18



没有为我工作:( - Igal
@Igal - 如果我上面显示的这个原生动作不起作用,那么考虑编写一个非原生的JavascriptExeucutor方法来进行悬停。 - djangofan


Actions builder = new Actions(driver);
builder.MoveToElement(menu).MoveToElement(submenu).Click().Perform();

它适用于Chrome,但在FF中不起作用


1
2018-02-06 14:13



没有为我工作:( - Igal