问题描述
免责声明:我知道这个问题与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">
。一个简单的任务?
问题
如何从<div class="gridBox"> <!-- 2 -->
开始识别//label[contains(.,"In Progress and Rejected") ]/ancestor::div
?
解决方法
我会使用following::
轴而不是ancestor::
轴。
此XPath,
//label[normalize-space()="In Progress and Rejected"]
/following::div[@class="table"][1]
选择<div class="table">
之后的第一个label
元素,其空间规范化的字符串值等于目标文本。
另请参阅Difference between child,following and descendant in XPath axes