java Xpath:使用selenium提取两种不同类型标签之间的标签文本

mwg9r5ms  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(218)

我正在使用Selenium,在选择其他两种类型的标记时遇到了问题。

  1. <div class='my-class'>
  2. <p>This is a paragraph 1</p><p>This is a paragraph 2</p><p>This is a paragraph 3</p>
  3. <h3>Introduction</h3>
  4. <p>This is a paragraph 4</p><p>This is a paragraph 5</p><p>This is a paragraph 6</p>
  5. <p>This is a paragraph 7</p><p>This is a paragraph 8</p><p>This is a paragraph 9</p>
  6. <h3>Conclusion</h3>
  7. </div>

我所要做的是只抓取“Introduction”和“Inclusion”标记之间的段落,而不是前面或后面的段落,这是一个xpath符号,它似乎可以完美地与在线验证器一起工作,但在Selenium中却不行:

  1. //div[@class='my-class']/h3[contains(., 'Conclusion')]/preceding-sibling::p[preceding-sibling::h3[contains(., 'Introduction')]]

下面是我的Selenium代码:

  1. allElementsArray = driver.findElements(By.xpath(path));

我相信xpath符号是有效的,因为它与验证器一起工作,但是当与Selenium一起运行时,它没有返回匹配项。
在XPath Web测试器中尝试了XPath,它工作正常,但在Selenium代码中不工作。

r1zk6ea1

r1zk6ea11#

XPath在我看来还不错。也许XPath实现中有一个bug。我想这取决于您使用的驱动程序。
不过,在我看来,如果它工作正常,它将以相反的顺序返回p元素(因为它返回从preceding-sibling轴读取的元素),我认为您实际上不太可能希望这样。
要解决这个错误,您可以尝试使用这个稍微简单一点的XPath查询:

  1. //div[@class='my-class']/p
  2. [following-sibling::h3[contains(., 'Conclusion')]]
  3. [preceding-sibling::h3[contains(., 'Introduction')]]

或者,如果您知道h3元素的完整文本,则不需要contains

  1. //div[@class='my-class']/p
  2. [following-sibling::h3='Conclusion')]
  3. [preceding-sibling::h3='Introduction')]
kgqe7b3p

kgqe7b3p2#

下面的XPath使用支持XPath 1.0的工具,如xmllint
//div[@class="my-class"]/p[following-sibling::h3[contains(., "Conclusion")] and preceding-sibling::h3[contains(., "Introduction")]]

  1. xmllint --html --xpath '//div[@class="my-class"]/p[following-sibling::h3[contains(., "Conclusion")] and preceding-sibling::h3[contains(., "Introduction")]]' tmp.html

结果

  1. <p>This is a paragraph 4</p>
  2. <p>This is a paragraph 5</p>
  3. <p>This is a paragraph 6</p>
  4. <p>This is a paragraph 7</p>
  5. <p>This is a paragraph 8</p>
  6. <p>This is a paragraph 9</p>

相关问题