【问题标题】:Java selenium xpath - getting all elements under a specific elementJava selenium xpath - 获取特定元素下的所有元素
【发布时间】:2014-12-23 09:28:34
【问题描述】:

这是我正在搜索的一个简化的 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

我需要提取第一个找到的主类下的所有数字,因此我进行了查询以搜索第一个主类,以及它下具有特定类的所有 td。有人可以给我一个提示我做错了什么,因为这个查询给了我所有“主”div中所有td类“child”的所有数字:

List<WebElement> koefi = driver.findElements(By.xpath("//div[@class='main'][1]//td[@class='child']"));

我做错了什么或者我的逻辑是正确的,但是由于结构过于繁琐,我没有在此处粘贴 html 的其他部分......?

谢谢!!

附言: 我也试过了,但又一次,我得到了所有带有“child”类的 td 的内容,而不仅仅是第一个“main”..

List<WebElement> koefi = driver.findElements(By.xpath("//*[1][@class='main']//td[@class='child']"));

更新: 我设法解决了我的问题,首先让 .findElement 函数默认找到的“主” div 的第一次出现:

WebElement element = driver.findElement(By.xpath("//*[1][@id='main']"));

然后用 .findElements 函数提取“子”类:

List<WebElement> kk = element.findElements(By.className("child"));

我仍然无法弄清楚为什么我的 xpath 中的 .findElements 不能工作,或者它工作得太好了,它提取了每个“主”类,而不仅仅是第一个。而且原版的HTML太大了,这里贴不出来,不想打扰你们!!

【问题讨论】:

  • 你有什么错误吗?你能试试:java.util.List koefi = driver.findElements(By.xpath("//div[@class='main'][1]//td[@class='child']" ));
  • 您确定所有&lt;div class="main"&gt; 都是兄弟姐妹吗?
  • @Helping:我得到了所有“子”元素的列表,我的目标是仅在第一个“主”下获取“子”元素。我在我文件的顶部..
  • @Maroun:“主”容器上方有一个底层结构,但是,是的,它们都在同一级别,例如 div1>div2>div3>main,然后是 div1>div2> div3>main 等等..
  • 原始问题 //div[@class='main'][1]//td[@class='child'] 中的 xpath 包含一个相对路径,适用于所有主类。

标签: java selenium xpath


【解决方案1】:

一个更清洁的解决方案是首先获取所有divs 类main,如下所示:

List<WebElement> allDivs = driver.findElements(By.className("main"));

然后,按照您的指定,找到所有类为childtds,如下所示:

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

之后,只需遍历所有“td”并读出您的值即可。

【讨论】:

  • 这是一个很好的方法,感谢您的想法。我以类似的方式做到了这一点,我第一次使用 .findelement() 获得了“main”,而他们使用 .findelements() 获得了所有“child”td。但非常感谢你的想法!!
【解决方案2】:

你在评论中说

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

所以我怀疑您遇到了与 XPath 中 // 的定义相关的常见错误。路径

//div[@class='main'][1]

选择文档中的第一个“主”div。原因是///descendant-or-self::node()/的简写(包括前导斜杠和尾随斜杠),所以这条路径的真正含义是

/descendant-or-self::node()/child::div[@class='main'][1]

当您看到它完全展开时,您会意识到 [1]child:: 步骤相关,而不是搜索后代,即您将获得文档中具有“main”类的所有 div 元素" 是它们各自父元素下的第一个 div-with-class-main。如果您的实际 HTML 是

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

那么 XPath 会选择他们两个(他们都是他们父母下的第一个)。如果您只想要文档中的第一个,那么您应该使用descendant::

/descendant::div[@class='main'][1]

这只会给你第一个匹配的后代。

【讨论】:

  • 不应该这样://*[1][@class='main']//td[@class='child'] 也让我第一次出现“main”吗?
  • @Hrvoje85 谓词从左到右应用 - //*[1][@class='main'] 表示文档中的每个元素都是其父元素的第一个子元素,并且具有 main 类,而 //*[@class='main'][1] 则为每个元素都是其父元素中第一个具有类主元素的元素。
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2012-06-07
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多