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

3

我有一个非常简单的请求,我在一个HTML页面中有一个div,我可以通过它的XPath访问,即://div[2]/div/div[2]/div[2]/div[2]

我想要一个XPath,可以给出此div的所有子元素,但我找不到它。 我需要使用Selenium的findElements方法获取元素,但是我尝试过的内容都不起作用:

我的HTML代码如下:

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

我将使用如下XPath:
//div[2]/div/div[2]/div[2]/div[2]/child

我的 Java Selenium 脚本如下:
List<WebElement> listElement = driver.findElements(By.xpath(xpath));

for(WebElement element : listElement) {
    System.out.println(element.getAttribute("id"));
}

我应该使用什么XPath来获取div的子元素?

编辑1:我使用了*并且它可以工作,但是当我计算元素数量时,它打印了6。*是否将其子代视为自己的子代?


1
//path/to/element/* - /* 表示选择 element 的所有直接子元素。 - Marc B
2个回答

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 对象。

强烈不建议仅提供代码答案。请解释您的代码是如何工作的以及它如何回答问题。 - JeffC

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 选择了多个元素,然后您选择了不止目标 div 元素的子元素。


更新2:

如果您无法发布 MCVE,并且仍然对返回的子元素数量感到困惑,请参考以下内容。

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

尝试挑战您提供的XPath作为基础:

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

首先,尝试。
//div[2]

您是否真的能够选择单个 div 以达到您的预期?

那么尝试一下:

//div[2]/div

再次确认这个是否真的选择了你期望的单个div

继续这样做,直到你发现选定的元素与你的期望不符。在那里,你的答案将变得明显,或者你会有一个更具体的问题要问。

没有看到你的XML/HTML,这就是最好的建议了。


但是,xpath如何指向多个元素,例如//div[2]/div/div[2]/div[2]/div[2]? - Robert Reynolds
首先,你的XPath中第二个div没有索引。但是,实际上,你应该发布一个[mcve];可能有更好的方法来创建比你提供的更健壮的XPath。 - kjhughes
我正在从事的项目真的很糟糕,因为他们想要制作一些“动态”和“通用”的东西,但最终只是一团糟,没有恒定的ID,我无法使用CSS标签来隔离不同的元素...如果我能提供最小、完整和可验证的示例就好了。 - Robert Reynolds
回答已更新,为您提供一种常规的XPath诊断技术。 - kjhughes
使用XPath //div[2]/div/div[2]/div[2]/div[2]/*,然后在循环中打印element.getAttribute("outerHTML")。这应该会指向使用此XPath找到的所有不同元素。找出您不想要的哪个(些),并更新XPath以将它们排除在外。 - JeffC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接