我正在尝试寻找一个基于文本的节点,该节点可以在它的直接兄弟的子/孙节点上获得 . 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 .
//div[following-sibling::div[1][//*[contains(text(),'some text')]]
寻找上面找到的div的第一个兄弟 . 在这个兄弟中,它会查找包含我们正在寻找的文本的元素 .
但是,当我查看它返回的元素数量时,它实际上大于具有“searchingDivClass”的元素数量 .
请注意删除// * [contains(text(),'some text')]
至少返回搜索到的类的元素数 .
最后,它自己的最后一个XPath正确返回包含文本的元素 .
有什么想法,还是建议?
1 回答
所以你需要将你的问题分成两部分
让我们一一解决
element we need to select
所以我们知道该元素将有一个类
searchedDivClass
. 所以这个很简单,下面应该可行condition that element has to match
第一个条件是应该有一个跟随div标签(或基本上是兄弟姐妹 .
现在下一个条件我们要添加这个兄弟,这个兄弟应该有一个有文本
some text
的孩子 . 所以我们用另一个条件更新我们的xpath请注意,我使用的是
.//
而不是//
,因为.//
将从当前节点中获取子节点,而您使用的//
则表示文档中的任何位置 .所以我们的最终XPATH将是