【问题标题】:How to Hover over and click on an invisible element using selenium webdriver?如何使用 selenium webdriver 悬停并单击不可见元素?
【发布时间】:2012-10-17 00:11:00
【问题描述】:

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

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

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

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"))

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

【问题讨论】:

  • 你找到解决办法了吗?对我来说,以下代码有效: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 时,它没有按预期工作。

标签: java selenium-webdriver


【解决方案1】:

好吧,在多次回答你的问题并多次更改我的答案之后,我会同意 -

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

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

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

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

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

【讨论】:

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

使用类似 javascript 的执行器

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

【讨论】:

  • 感谢您的回复!在哪里使用这个?在单击悬停在元素或列表中显示的下一个元素上时?
  • 您可以随时使用上面的代码,即使元素不可见也可以使用。
  • 除了使用 javascript 还有其他选择吗?另一方面,你能告诉我上面的java代码中的错误/问题是什么吗?
  • 上面的 javascript 在我的场景中可能不起作用,因为元素只能通过 xPath 而不是 ids 访问。 ID 是动态生成的,因此不会用于定位元素
  • 但这只是点击隐藏的网址或链接。鼠标悬停时未打开下拉菜单。我需要打开菜单鼠标
【解决方案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();    
}

【讨论】:

  • @Igal - 如果我在上面显示的本机操作不起作用,请考虑编写一个非本机 JavascriptExecutor 方法来执行悬停。
【解决方案4】:
Actions builder = new Actions(driver);
builder.MoveToElement(menu).MoveToElement(submenu).Click().Perform();

Chrome下可以,FF下不行

【讨论】:

    【解决方案5】:

    你可以试试这个:

    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)));
    }
    

    【讨论】:

      【解决方案6】:

      我的情况是我们有一个行表,如果鼠标悬停在行上,其中一个列(td)应该显示一些 4 个图标,我们应该点击它。

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

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

      clickAndHold()点击并按住悬停的元素,方便我们对可见元素进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2011-08-31
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多