【问题标题】:XPath Selenium VBAXPath 硒 VBA
【发布时间】:2017-08-19 05:42:04
【问题描述】:

我正在尝试根据其直系兄弟的子/孙节点上可用的文本来查找节点。 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 的第一个兄弟。在这个同级中,它会查找包含我们要查找的文本的元素。

但是,当我查看它返回的元素数量时,它实际上大于具有“searchedDivClass”的元素数量。

请注意,删除 //*[包含(text(),'一些文本')]

至少返回搜索到的类的元素个数。

最后,它自己的最后一个 XPath 正确地返回了包含文本的元素。

有什么想法或建议吗?

【问题讨论】:

  • 您实际上要选择哪个元素?
  • 我编辑了我的答案以使其更加清晰。我正在尝试根据其直接兄弟的子节点中的文本获取具有“DynamicId1”的 div。
  • 您能否准确地告诉我们您要查找的元素/文本以及相对于哪个元素/文本?
  • 我正在寻找 id 为“DynamicId1”的 div,基于“h1”下的文本。主要挑战是标签并不总是 h1,而且我们不知道在“nextSibling”中我们必须走多远。不过,Tarun 的回答非常完美。

标签: html vba selenium xpath


【解决方案1】:

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

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

让我们一一解决

我们需要选择的元素

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

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

元素必须匹配的条件

第一个条件是后面应该有一个 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')]]]

【讨论】:

  • 感谢 Tarun,我目前不在笔记本电脑旁边,但有机会我会尝试一下
  • 看起来我缺少的是“.//*”前面的点。这很完美。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2018-01-21
相关资源
最近更新 更多