首页 文章

XPath Selenium VBA

提问于
浏览
2

我正在尝试寻找一个基于文本的节点,该节点可以在它的直接兄弟的子/孙节点上获得 . 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 回答

  • 1

    所以你需要将你的问题分成两部分

    (element we need to select)[condition that element has to match]
    

    让我们一一解决

    element we need to select

    所以我们知道该元素将有一个类 searchedDivClass . 所以这个很简单,下面应该可行

    //div[contains(@class,'searchedDivClass')]
    

    condition that element has to match

    第一个条件是应该有一个跟随div标签(或基本上是兄弟姐妹 .

    following-sibling::div[1]
    

    现在下一个条件我们要添加这个兄弟,这个兄弟应该有一个有文本 some text 的孩子 . 所以我们用另一个条件更新我们的xpath

    following-sibling::div[1][.//*[contains(text(),'some text')]]
    

    请注意,我使用的是 .// 而不是 // ,因为 .// 将从当前节点中获取子节点,而您使用的 // 则表示文档中的任何位置 .

    所以我们的最终XPATH将是

    //div[@class='searchedDivClass'][following-sibling::div[1][.//*[contains(text(),'some text')]]]
    

相关问题