如何为最近的祖先提供 XPath?
Posted
技术标签:
【中文标题】如何为最近的祖先提供 XPath?【英文标题】:How to provide an XPath for nearest ancestor? 【发布时间】:2020-09-14 18:21:48 【问题描述】:免责声明:我知道这个问题与XPath to find nearest ancestor element that contains an element that has an attribute with a certain value 非常相似。不幸的是,我不太明白如何选择最近/最近的祖先?
这是我的场景。我正在为显示多个数据“表”的网页构建自动化测试。每个“表”都需要通过其'<label>
内容而不是“表”上的普通id
属性来标识(例如id
不存在)。
这张图片说明了我正在使用的结构(来自 chrome 浏览器窗口的快照):
这是对应的伪html的要点:
<root>
...
<div class="gridBox"> <!-- 1 -->
<div class="gridBox"> <!-- 2 -->
<div class="gridBox"> ... </div>
<div class="gridBox">
<label>In Progress and Rejected</label> <!-- I want to start here -->
</div>
<div class="gridBox">
<div class="gridBox">
<div class="table"> <!-- I want to identify this element -->
<div class="row">
<div class="header">
<div class="column">...</div>
</div>
...
</div>
<div class="row">
<div class="cell">Value 1</div>
<div class="cell">Value 2</div>
...
</div>
</div>
</div>
</div>
</div>
<div class="gridBox">
...
<div class="gridBox">
<label>Await approval</label>
</div>
...
</div>
<div class="gridBox">
...
<div class="gridBox">
<label>Approved</label>
</div>
...
</div>
</div>
...
<root>
接近
我希望<label>In Progress and Rejected</label>
成为起点。接下来我要做的就是爬上这个祖先节点:<div class="gridBox"> <!-- 2 -->
。最后,我想找到包含的后代子节点<div class="table">
。一个简单的任务?
问题
如何识别从//label[contains(.,"In Progress and Rejected") ]/ancestor::div
开始的<div class="gridBox"> <!-- 2 -->
?
【问题讨论】:
【参考方案1】:我会使用following::
轴而不是ancestor::
轴。
这个 XPath,
//label[normalize-space()="In Progress and Rejected"]
/following::div[@class="table"][1]
选择label
之后的第一个<div class="table">
元素,其空间标准化字符串值等于目标文本。
另见Difference between child, following and descendant in XPath axes
【讨论】:
我不知道可以在除直接兄弟节点之外的其他节点上使用/following
。感谢您提供(整个!)解决方案,效果很好! :-)
@HaunsTM:不客气。我添加了一个链接,您可能会发现它对详细介绍 XPath 轴的 Q/A 很有帮助。以上是关于如何为最近的祖先提供 XPath?的主要内容,如果未能解决你的问题,请参考以下文章