如何使用 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 的执行速度较慢。
rootWebElement
是 WebElement
类的一个实例。 WebElement
类实现了SearchContext
接口以及WebDriver
类。所以搜索是在某个特定元素内完成的,而不是在整个页面内。
如果您只想要特定元素的***子元素,只需删除其中一个斜线:List<WebElement> 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) 。试试这个:
List<WebElement> childs = rootWebElement.findElements(By.tagName(".//*"));
【讨论】:
这是第一个答案的副本。以上是关于如何使用 webdriver 获取元素的所有后代?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Selenium C#WebDriver查找所有父元素?
如何在 Selenium WebDriver 中获取“ul”类的所有“li”元素
Selenium webdriver:如何找到元素的所有属性?