如何为最近的祖先提供 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>

接近 我希望&lt;label&gt;In Progress and Rejected&lt;/label&gt; 成为起点。接下来我要做的就是爬上这个祖先节点:&lt;div class="gridBox"&gt; &lt;!-- 2 --&gt;。最后,我想找到包含的后代子节点&lt;div class="table"&gt;。一个简单的任务?

问题 如何识别从//label[contains(.,"In Progress and Rejected") ]/ancestor::div开始的&lt;div class="gridBox"&gt; &lt;!-- 2 --&gt;

【问题讨论】:

【参考方案1】:

我会使用following:: 轴而不是ancestor:: 轴。

这个 XPath,

//label[normalize-space()="In Progress and Rejected"]
 /following::div[@class="table"][1]

选择label 之后的第一个&lt;div class="table"&gt; 元素,其空间标准化字符串值等于目标文本。

另见Difference between child, following and descendant in XPath axes

【讨论】:

我不知道可以在除直接兄弟节点之外的其他节点上使用/following。感谢您提供(整个!)解决方案,效果很好! :-) @HaunsTM:不客气。我添加了一个链接,您可能会发现它对详细介绍 XPath 轴的 Q/A 很有帮助。

以上是关于如何为最近的祖先提供 XPath?的主要内容,如果未能解决你的问题,请参考以下文章

如何为用户提供的国名预测正确的国名?

如何为用户提供丰富的通知服务(包括图片图标)?

如何为 React Native 中调用的每次 onPress 函数提供自动增量?

如何为 XML 创建 XPath?

洛谷P3379 模板最近公共祖先(LCA)

如何为 UIbuttons 提供约束