我正在尝试根据其直系兄弟的子/孙节点上可用的文本查找节点。 HTML 看起来像这样:
<div>
<div class="searchedDivClass" id="DynamicId1">
</div>
<div class="classType1">
//<h1> some text </h1>
</div>
//
<div class="searchedDivClass">
</div>
<div class="classType2">
//<p> some other text </p>
</div>
</div>
如您所见,搜索到的文本可以在任何类型的标签中,但它始终是文本的一部分。
我认为下面的 XPath 可以工作:
drive.FindElementsByXPath("//div[following-sibling::div[1][//*[contains(text(),'some text')]] and contains(@class,'searchedDivClass')]")
分解成碎片:
//div[contains(@class,'searchedDivClass')]
确保它返回我正在寻找的正确级别的 div,而不是在树中更高或更低的位置。
//div[following-sibling::div[1][//*[contains(text(),'some text')]]
寻找上面找到的 div 的第一个兄弟。在这个 sibling 中,它寻找一个包含我们正在寻找的文本的元素。
但是,当我查看它返回的元素数量时,它实际上大于具有“searchedDivClass”的元素数量。
请注意,删除 //*[包含(文本(),'一些文本')]
至少返回具有搜索类的元素的数量。
最后,最后一个 XPath 本身正确地返回了包含文本的元素。
有什么想法或建议吗?
最佳答案
所以你需要把你的问题分成两部分
(element we need to select)[condition that element has to match]
让我们一一解决
我们需要选择的元素
所以我们知道该元素将有一个类 searchedDivClass
。所以这个很简单,下面应该可以工作
//div[contains(@class,'searchedDivClass')]
元素必须匹配的条件
第一个条件是后面应该有一个 div 标签(或者基本上是一个兄弟标签。
following-sibling::div[1]
现在我们要在这个 sibling 上添加下一个条件,即这个 sibling 应该有一个 child ,该 child 有文本 some text
。所以我们用另一个条件更新我们的 xpath
following-sibling::div[1][.//*[contains(text(),'some text')]]
请注意,我使用了 .//
而不是 //
因为 .//
将从当前节点子节点获取,而 //
你在文档的任何地方使用的意思。
所以我们最终的 XPATH 将是
//div[@class='searchedDivClass'][following-sibling::div[1][.//*[contains(text(),'some text')]]]
关于html - XPath Selenium VBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45768094/