如何通过现有元素(而不是xpath)查找子元素(不是所有后代元素)

时间:2013-08-05 19:53:34

标签: java css selenium webdriver selenium-webdriver

我正在尝试找到已经找到的元素的子元素。我遇到的问题是我似乎只能得到现有元素的所有后代。

例如,给定以下HTML代码段(您可能会将其识别为引导程序下拉菜单)。

<div class="dropdown">
  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu">
    <li>
      <a tabindex="-1" href="#">Action</a>
    </li>
    <li>
      <a tabindex="-1" href="#">Another action</a>
    </li>
    <li>
      <a tabindex="-1" href="#">Something else here</a>
    </li>
    <li class="divider"></li>
    <li class="dropdown-submenu">
      <a tabindex="-1" href="#">More options</a>
      <ul class="dropdown-menu">
        <li><a tabindex="-1" href="#">Second level link</a></li>
        <li><a tabindex="-1" href="#">Second level link</a></li>
        <li><a tabindex="-1" href="#">Second level link</a></li>
        <li><a tabindex="-1" href="#">Second level link</a></li>
        <li><a tabindex="-1" href="#">Second level link</a></li>
      </ul>
    </li>
  </ul>
</div>

我已经在下拉菜单中显示了现有的WebElement

WebElement dropdown = driver.findElementBy(By.cssSelector(".dropdown > .dropdown-menu");

而我正试图抓住最外层菜单中所有孩子的手柄。最初我正在做以下

List<WebElement> menuItems = dropdown.findElements(By.cssSelector(" > li > a");

假设它会导致构建最终选择器

.dropdown > .dropdown-menu > li > a

但是,这会引发异常

Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: An invalid or illegal string was specified

执行以下操作不会抛出异常,但会返回所有后代......而不仅仅是子节点。 menuItems的结果是10而不是5。

List<WebElement> menuItems = dropdown.findElements(By.cssSelector("li > a");

所以我想我的最终问题是有一种方法可以使用By.cssSelector来获取已经找到的节点的直接子节点吗?

XPATH不是一个允许的解决方案。

2 个答案:

答案 0 :(得分:1)

稍微改变逻辑怎么样?

您有一个名为WebElement的{​​{1}},但它在DOM中定义为类dropdown。为什么不将dropdown-menu定义为dropdown而不是div.dropdown?那你的问题就可以解决了。

ul.dropdown-menu

答案 1 :(得分:0)

为什么不把它们结合起来?

List<WebElement> menuItems = driver.findElements(By.cssSelector(".dropdown > .dropdown-menu  > li > a");