如何为最近的祖先提供 XPath?
How to provide an XPath for nearest ancestor?
免责声明:我知道这个问题与 XPath to find nearest ancestor element that contains an element that has an attribute with a certain value 非常相似。不幸的是,我不太明白如何 select closest/nearest 祖先?
这是我的场景。我正在为显示多个数据“tables”的网页构建自动化测试。每个“table”都需要通过其 <label>
内容来标识,而不是“table”上的正常 id
属性(例如 id
不存在)。
这张图片说明了我正在使用的结构(来自 chrome 浏览器 window 的快照):
这是相应伪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]
选择 label
之后的第一个 <div class="table">
元素,其 space-normalized 字符串值等于目标文本。
另见 Difference between child, following and descendant in XPath axes
免责声明:我知道这个问题与 XPath to find nearest ancestor element that contains an element that has an attribute with a certain value 非常相似。不幸的是,我不太明白如何 select closest/nearest 祖先?
这是我的场景。我正在为显示多个数据“tables”的网页构建自动化测试。每个“table”都需要通过其 <label>
内容来标识,而不是“table”上的正常 id
属性(例如 id
不存在)。
这张图片说明了我正在使用的结构(来自 chrome 浏览器 window 的快照):
这是相应伪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]
选择 label
之后的第一个 <div class="table">
元素,其 space-normalized 字符串值等于目标文本。
另见 Difference between child, following and descendant in XPath axes