如何使用 webdriver 获取元素的所有后代?

Posted

技术标签:

【中文标题】如何使用 webdriver 获取元素的所有后代?【英文标题】:How to get all descendants of an element using webdriver? 【发布时间】:2012-12-12 16:58:05 【问题描述】:

有这个元素有子元素,那些子元素又有子元素等等。我想获取所有元素的后代元素。谢谢。

【问题讨论】:

【参考方案1】:

试试这个:

(Java)

List<WebElement> childs = rootWebElement.findElements(By.xpath(".//*"));

(C#)

IReadOnlyList<IWebElement> childs = rootWebElement.FindElements(By.XPath(".//*"));

【讨论】:

有没有办法使用 CSS 实现同样的效果? By.cssSelector("*") - 这应该与By.xpath(".//*") 的工作方式相同,但不能 100% 确定它不会搜索所有文档 (w3.org/TR/CSS2/selector.html)。为什么 XPath 解决方案不适合您? 我正在使用的应用程序仅与 IE 兼容。使用 CSS 优于 XPath,因为与 IE 中的 CSS 相比,XPath 的执行速度较慢。 rootWebElementWebElement 类的一个实例。 WebElement 类实现了SearchContext 接口以及WebDriver 类。所以搜索是在某个特定元素内完成的,而不是在整个页面内。 如果您只想要特定元素的***子元素,只需删除其中一个斜线:List&lt;WebElement&gt; topLevelChildren = rootWebElement.findElements(By.xpath("./*"));【参考方案2】:

试试这个

List<WebElement> allDescendantsChilds = rootWebElement.findElements(By.xpath("//tr[@class='parent']//*"));

以上内容将为您提供 parent tr

的所有后代子元素(不仅是直接子元素)

【讨论】:

tr 到底在做什么?该元素不必是表格。 例如我提到的像tr。在 tr 地方,你用具有 child > child 的父标签替换(例如:tr > td > div > input )在这种情况下它将给出 td,div,input 元素 假设有一个表有 10 个 trs,每行有 10 个 tds,每个 td 有 10 个跨度。如果元素是表格,我期望得到的是 10trs、100tds 和 1000spans 但你的代码只给出 1tr 10tds 100 spans? NO ..它会给出(我也验证过)所有 trs (10), tds (100) , spans (1000) 。 ................. 这种格式会给出..检查一下。 好的,rootWebElement 持有哪个elmeent?它拥有父元素?我必须用父元素的第一个子元素替换 tr 吗?抱歉,我是 XPath 的新手,你能多解释一下你的代码吗?【参考方案3】:

试试这个:

List<WebElement> childs = rootWebElement.findElements(By.tagName(".//*"));

【讨论】:

这是第一个答案的副本。

以上是关于如何使用 webdriver 获取元素的所有后代?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Selenium C#WebDriver查找所有父元素?

如何在 Selenium WebDriver 中获取“ul”类的所有“li”元素

Selenium webdriver:如何找到元素的所有属性?

使用 jQuery 获取不是具有特定 CSS 类的容器的子元素的元素的后代

如何只搜索 XDocument 的子项,而不是其所有后代?

如何通过使用SeleniumWebdriver和Python滚动查找网页上的所有元素