带有Java的Selenium Webdriver-单击超链接的下拉容器

时间:2018-07-21 20:35:40

标签: java html selenium drop-down-menu dropdown

我需要单击Dropdown容器内的元素。我尝试了几次搜索,但是找不到正确的解决方案。 select方法不起作用,当没有ID,名称或类与其相关时,我仍然不知道如何使用选择器。这是HTML代码:

<a href="/account/settings/info"class="account-link">Account<span class="caret"></span></a>

<div class="account-dropdown__container">
    <ul>
        <li><a href="/account/settings/info" target="_self">Account</a></li>
        <li><a href="/wedding-registry/invite" target="_self">Invite Friends</a></li>
        <li><a href="/account/settings/credits" target="_self">Zola Store Credit</a></li>
        <li><a href="/registry/settings/info" target="_self">Registry Settings</a></li>
        <li><a href="/account/settings/orders" target="_self">Orders You've Placed</a></li>
        <li><a>Log out</a></li>
    </ul>
</div>

第一段代码是一个按钮,但是如果我将鼠标放在它上面,它将显示我正在谈论的Dropdown容器。如果我将鼠标放在其上而不单击,它将显示下拉列表的列表。 (而且我还想知道如何悬停元素以显示列表而不单击它,因为它是隐藏的。)

然后,我的问题是:如何单击注册表设置?

它没有ID,也没有类(尽管它在class account-dropdown__container内)。我想我可以使用By.name("Registry Settings"),但是除非打开下拉列表,否则它是不可见的,因此不会单击,并且会显示Css Selector not found错误。想要帮助吗?谢谢!

此外,我在IntelliJ IDEA中使用Cucumber + Selenium + Java,其合成轴稍有变化,但是仍然与我在本论坛中发现的代码有所不同。因此,为什么我要为我的问题寻求具体的解决方案。

2 个答案:

答案 0 :(得分:1)

您必须首先使下拉菜单可见。

就像在Selenium中一样,您不能仅将元素悬停,而必须一次完成所有操作。

检查以下内容:How to perform mouseover function in Selenium WebDriver using Java?

Actions action = new Actions(webdriver);
WebElement button = webdriver.findElement(By.class("account-link"));
action.moveToElement(button).moveToElement(webdriver.findElement(By.linkText("Registry Settings")).click().build().perform();

您可能需要等待一段时间才能显示下拉列表。我尚未测试过代码,您可能必须先对其进行修复。

答案 1 :(得分:0)

正如您提到的,将鼠标置于按钮上时,它将显示Dropdown容器。

可以在的帮助下自动进行相同操作:(我假设帐户按钮

Actions action = new Actions(driver);  
action.moveToElement(driver.findElement(By.linkText("Account"))).build().perform();

现在您的下拉列表已展开或在UI中可见,并且您想单击注册表设置。由于下拉菜单不是使用 HTML 中可用的选择选项标签进行的。您不能使用中的选择类别

您将必须将下拉列表中存在的所有元素存储到列表。然后根据某些条件,可以单击您的欲望元素。

代码:

List<WebElement> options =    driver.findElements(By.cssSelector("div.account-dropdown__container ul li"));
        for(WebElement option : options) {
            if(option.getText().trim().contains("Registry Settings")) {
                option.click();
            }
        }

希望这会有所帮助。