我正在使用Selenium,在选择其他两种类型的标记时遇到了问题。
<div class='my-class'>
<p>This is a paragraph 1</p><p>This is a paragraph 2</p><p>This is a paragraph 3</p>
<h3>Introduction</h3>
<p>This is a paragraph 4</p><p>This is a paragraph 5</p><p>This is a paragraph 6</p>
<p>This is a paragraph 7</p><p>This is a paragraph 8</p><p>This is a paragraph 9</p>
<h3>Conclusion</h3>
</div>
我所要做的是只抓取“Introduction”和“Inclusion”标记之间的段落,而不是前面或后面的段落,这是一个xpath符号,它似乎可以完美地与在线验证器一起工作,但在Selenium中却不行:
//div[@class='my-class']/h3[contains(., 'Conclusion')]/preceding-sibling::p[preceding-sibling::h3[contains(., 'Introduction')]]
下面是我的Selenium代码:
allElementsArray = driver.findElements(By.xpath(path));
我相信xpath符号是有效的,因为它与验证器一起工作,但是当与Selenium一起运行时,它没有返回匹配项。
在XPath Web测试器中尝试了XPath,它工作正常,但在Selenium代码中不工作。
2条答案
按热度按时间r1zk6ea11#
XPath在我看来还不错。也许XPath实现中有一个bug。我想这取决于您使用的驱动程序。
不过,在我看来,如果它工作正常,它将以相反的顺序返回
p
元素(因为它返回从preceding-sibling
轴读取的元素),我认为您实际上不太可能希望这样。要解决这个错误,您可以尝试使用这个稍微简单一点的XPath查询:
或者,如果您知道
h3
元素的完整文本,则不需要contains
:kgqe7b3p2#
下面的XPath使用支持XPath 1.0的工具,如
xmllint
//div[@class="my-class"]/p[following-sibling::h3[contains(., "Conclusion")] and preceding-sibling::h3[contains(., "Introduction")]]
结果