4

我试图找到一个已经找到的元素的孩子。我遇到的问题是我似乎只能获得现有元素的所有后代。

例如,给定以下 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");

我正在尝试处理最外层菜单的所有子 li。最初我正在执行以下操作

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 不是一个允许的解决方案。

4

2 回答 2

1

稍微改变一下逻辑呢?

你有一个WebElement被调用的dropdown,但它被定义为dropdown-menuDOM 中的类。为什么不定义dropdowndiv.dropdown而不是ul.dropdown-menu?那么你的问题就可以解决了。

WebElement dropdown = driver.findElement(By.cssSelector(".dropdown");
List<WebElement> menuItems = dropdown.findElements(By.cssSelector(".dropdown-menu[role='menu'] > li > a");
List<WebElement> subMenuItems = dropdown.findElements(By.cssSelector(".dropdown-submenu li > a");
于 2013-08-05T21:32:06.177 回答
0

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

List<WebElement> menuItems = driver.findElements(By.cssSelector(".dropdown > .dropdown-menu  > li > a");
于 2013-08-05T21:36:30.053 回答