我正在尝试找到已经找到的元素的子元素。我遇到的问题是我似乎只能得到现有元素的所有后代。
例如,给定以下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不是一个允许的解决方案。
答案 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");