html - XPath Selenium VBA

标签 html vba selenium xpath

我正在尝试根据其直系兄弟的子/孙节点上可用的文本查找节点。 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/

相关文章:

php - HTML 输入名称与数据库列名称的对应关系 : how to protect from possible attacks

html - 自动调整高度并垂直居中容器内的居中 Div

html - 3种不同的CSS背景

vba - 在 Excel 2010 上寻找更好定义的范围?

vba - Excel VBA - 根据单元格地址获取表格名称

html - 垂直和水平居中圆 Angular 矩形内的文本

Excel 工作簿打开事件宏并不总是运行

jquery - 使用 css 选择器检查第一个元素

C# selenium 加载 html

python - 从 apache2 开始 selenium session