通过XPath获取HTML元素的子元素

时间:2016-07-06 14:32:17

标签: java html xml selenium xpath

我有一个非常简单的问题,我在一个html页面中有一个div,我可以通过他的XPath访问它:ROW_NUMBER

我想要一个XPath,它会给这个div的所有孩子,但我找不到它。 我需要使用Selenium的findElements方法获取元素,但我测试的内容不起作用:

我的HTML代码如下所示:

//div[2]/div/div[2]/div[2]/div[2]

我希望像这样使用XPath:

<div>
    <input/>
    <span/>
    <p></p>
</div>

我的Java Selenium脚本是这样的:

//div[2]/div/div[2]/div[2]/div[2]/child

我应该使用什么XPath来获取List<WebElement> listElement = driver.findElements(By.xpath(xpath)); for(WebElement element : listElement) { System.out.println(element.getAttribute("id")); } 的孩子?

编辑1:我确实使用*并且它正在工作,但是当我计算它打印我的元素数量时6.是否*认为他孩子的孩子是他自己的孩子?

2 个答案:

答案 0 :(得分:1)

如果问题中HTML片段中的div位于

//div[2]/div/div[2]/div[2]/div[2]

然后input子元素就在这里:

//div[2]/div/div[2]/div[2]/div[2]/input

并且所有子元素都在这里:

//div[2]/div/div[2]/div[2]/div[2]/*

<强>更新

  

编辑1:我确实使用了*和它的工作,但是当我计算数字时   它打印我的元素6.是否*考虑他的孩子   孩子作为自己的孩子??

不,div/*仅选择父div的直接子元素。

如果您对比预期更多的孩子感到惊讶,那么基础XPath可能会选择多个元素,然后您选择的子项不仅仅是目标{{ 1}}元素。

更新2:

如果您无法发布MCVE,并且您仍然对返回的孩子数量感到疑惑,

div

尝试以您提供的XPath为基础挑战自己:

//div[2]/div/div[2]/div[2]/div[2]/*

首先,试试

//div[2]/div/div[2]/div[2]/div[2]/

它是否真的像您期望的那样选择单个//div[2]

然后尝试

div

再次,看看这个是否真的选择了你期望的单//div[2]/div

以这种方式继续,直到你到达所选元素的现实偏离你的期望的地方。你的回答很明显,或者你有一个更具体的问题要问。

如果没有看到您的XML / HTML,这与建议可以获得的一样好。

答案 1 :(得分:1)

List<WebElement> childs = driver.findElements(By.xpath("//div[2]/div/div[2]/div[2]/div[2]/*"));

在这种情况下,selenium会搜索路径div[2]/div/div[2]/div[2]/div[2]/中的所有子元素,并将它们作为WebElement对象设置在列表集合中。