如何使用selenium webdriver悬停并单击一个不可见的元素?

时间:2012-10-17 00:11:00

标签: java selenium-webdriver

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

  1. 将鼠标悬停在元素
  2. 点击元素(它将显示4个选项)
  3. 点击其中一个选项
  4. 我正在使用Java API进行selenium web驱动程序,以下是我一直在尝试的内容

    Actions builder = new Actions(driver);
    builder.moveToElement(MainMenuBTN).click().build().perform();
    
    subMenuBTN.click();
    
    1. MainMenuBTN =悬停鼠标时可见的元素 在它上面
    2. subMenuBTN =从菜单选项中选择的元素 显示
    3. 发生的事情是,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"))
      

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

6 个答案:

答案 0 :(得分:7)

使用像

这样的javascript执行器
((JavascriptExecutor) webdriver).executeScript("document.getElementById('btn').click();");

答案 1 :(得分:5)

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

问题 - 我从原始代码中获得了什么 -

你需要将光标移动到mainMenuBTN(当你将鼠标悬停在它上面时,可见的是不可见的元素),然后显示你需要点击的subMenuBTN。

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

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

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

答案 2 :(得分:3)

您的“动作”构建器对我来说有些不对劲。这是我使用的一个例子:

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 :(得分:1)

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

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

答案 4 :(得分:0)

您可以尝试以下方法:

  1. 通过xpath获取WebElement。
  2. 悬停元素。
  3. 再次通过xpath获取WebElement。
  4. 单击它。

这是因为当您将鼠标悬停在元素上时,元素的ID正在更改,因此您应该再次找到它。

Actions builder = new Actions(driver);

WebElement mainMenuBTN = getWebEl("xpath_string",5);
builder.moveToElement(mainMenuBTN).perform();
mainMenuBTN = getWebEl("xpath_string",5);
builder.click(mainMenuBTN);

我使用这种方法将受控的显式等待放入元素的实例化中。

protected WebElement getWebEl(String xpath, int waitSeconds) {
    wait = new WebDriverWait(driver, waitSeconds);
    return wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xpath)));
}

答案 5 :(得分:0)

在我的案例中,我们有一个行表,如果将鼠标悬停在该行上,则列(td)中的一个应显示一些4个图标,我们应该单击它。

Action action=new Action(driver);
action.moveToElement(hoverElt).clickAndHold().build().perform();

对我有用。 moveToELement()将控件移到元素

clickAndHold()单击并按住鼠标悬停的元素,这样我们可以轻松地对可见元素进行操作。