【发布时间】:2013-08-06 15:45:56
【问题描述】:
我正在尝试查找已找到元素的子元素。我遇到的问题是我似乎只能获取现有元素的所有后代。
例如,给定以下 HTML sn-p(您可能会将其识别为引导下拉菜单)。
<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 不是一个允许的解决方案。
【问题讨论】:
-
我不知道这是否可行...试试
dropdown.findElements(By.cssSelector(".dropdown > li >a")) -
@MrTi ...我明天试试。也许 findElements 将自己包含在搜索的上下文中。
-
如果您在 Chrome 的开发者控制台中运行
$$(".dropdown > .dropdown-menu > li > a")会发生什么?它会为你运行 CSS 选择器并返回它找到的元素。 -
为什么 xpath 不是一个允许的解决方案?
-
@Arran ... 在浏览器中使用该选择器就可以了。
标签: java css selenium webdriver selenium-webdriver