Java selenium xpath-获取特定元素下的所有元素

Java selenium xpath-获取特定元素下的所有元素,java,selenium,xpath,Java,Selenium,Xpath,这是我正在搜索的简化HTML结构: <div class="main"> ...other stuff... <td class="child">44</td> <td class="child">59</td> <td class="child">11</td> </div> <div class="main"> ...other stuff..

这是我正在搜索的简化HTML结构:

<div class="main">
...other stuff...
       <td class="child">44</td>
       <td class="child">59</td>
       <td class="child">11</td>
</div>
<div class="main">
...other stuff...
       <td class="child">5</td>
       <td class="child">14</td>
       <td class="child">98</td>
</div>
...this kind of structure repeats with similar numbers a few more times but with identical class names
然后使用.findElements函数提取“子”类:

List kk=element.findElements(By.className(“child”);

我仍然无法理解为什么.findElements不能与我的xpath一起工作,或者它工作得太好了,它提取每个“主”类,而不仅仅是第一个。而且原始HTML太大,无法粘贴到这里,所以我不想打扰你们

一个更干净的解决方案是首先用class
main
抓取所有
div
s,如下所示:

List<WebElement> allDivs = driver.findElements(By.className("main"));
List<WebElement> tds = allDivs[0].findElements(By.className("child"));

之后,只需迭代所有“tds”并读取您的值即可

“主”不是直接的兄弟姐妹

因此,我怀疑您遇到了一个与XPath中的
/
定义相关的常见错误。路径

//div[@class='main'][1]
不选择文档中的第一个“main”div。原因是
/
/genderant或self::node()/
的简写(包括前导和尾随斜杠),因此此路径的实际含义是

/genderant或self::node()/child::div[@class='main'][1]
当您看到它完全展开时,您会意识到
[1]
子步骤相关:
而不是搜索子体,即您将获得文档中所有
div
元素,这些元素具有类“main”,并且是在其各自父元素下具有类main的第一个div。如果您的实际HTML是

<div>
  <div class="main">...</div>
</div>
<div>
  <div class="main">...</div>
</div>

这将只为您提供第一个匹配的子体。

是否有任何错误?请尝试:java.util.List koefi=driver.findElements(By.xpath(“//div[@class='main'][1]//td[@class='child']);你确定所有的
都是兄弟姐妹吗?@help:我得到了所有“child”元素的列表,我的目标是只在第一个“main”下面得到“child”元素。。我在文件顶部导入了java.util.List。@Maroun:“main”容器上方有一个底层结构,但是,是的,它们都在同一级别,例如div1>div2>div3>main,然后又是div1>div2>div3>main等等包含一个适用于所有主类的相对路径。这是一个很好的方法,感谢您的想法。我以类似的方式做了这件事,我在.findelement()中第一次出现了“main”,在.findelement()中出现了所有的“child”td。但是非常感谢你的想法!!这是不是应该://*[1][@class='main']//td[@class='child']也给我第一个出现的“main”?@Hrvoje85谓词从左到右应用-
//*[1][@class='main']
表示文档中的每个元素都是其父元素的第一个子元素,并且具有类main,而不是
//*[@class='main'][1]
这将是父元素中第一个类为main的元素。
List<WebElement> kk = element.findElements(By.className("child"));
List<WebElement> allDivs = driver.findElements(By.className("main"));
List<WebElement> tds = allDivs[0].findElements(By.className("child"));
<div>
  <div class="main">...</div>
</div>
<div>
  <div class="main">...</div>
</div>