为啥 XPath previous-sibling::*[3] 有效,而leading-sibling::div[3] 无效?

Posted

技术标签:

【中文标题】为啥 XPath previous-sibling::*[3] 有效,而leading-sibling::div[3] 无效?【英文标题】:Why XPath preceding-sibling::*[3] works and preceding-sibling::div[3] not?为什么 XPath previous-sibling::*[3] 有效,而leading-sibling::div[3] 无效? 【发布时间】:2021-02-03 18:01:04 【问题描述】:

html代码是:

<div id="topNavigationBar" style="bottom: 0px; display: block;">
    <div id="topNavi_appSurrogates">
        <div class="topNavi_appSurrogate prototype">
            <div class="topNavi_appSurrogate_content">
                <div class="function refresh_app">Refresh</div>
                <div class="function show_app">Show</div>
                <div class="function hide_app">Hide</div>
                <div class="function quit_app">...</div>
            </div>
        </div>
        <div class="topNavi_appSurrogate" style="left: 279px; display: block;">
            <div class="topNavi_appSurrogate_content">
                <div class="function refresh_app">Refresh</div>
                <div class="function show_app">Show</div>
                <div class="function hide_app">Hide</div>
                <div class="function quit_app">Quit App1</div>
            </div>
        </div>
        <div class="topNavi_appSurrogate">
            <div class="topNavi_appSurrogate_content">
                <div class="function refresh_app">Refresh</div>
                <div class="function show_app">Show</div>
                <div class="function hide_app">Hide</div>
                <div class="function quit_app">Quit App2</div>
            </div>
        </div>
    </div>
</div>

最初这个问题应该是不同的,但我在“类似问题”中找到了解决方案。上面的代码中有多个带有Refresh 文本的div 元素。我正在寻找一个在最后一个兄弟的文本中具有特定应用程序名称的特定对象。 我的解决方案是:

Click Element                       xpath://div[text()='Quit App1']/preceding::*[3]

但是,我不明白为什么

Click Element                       xpath://div[text()='Quit App1']/preceding::div[3]

不起作用。只有div 元素,我没有在寻找其他元素。

我访问了许多解释 XPath 的网站,但没有找到答案。请帮我理解一下。

【问题讨论】:

【参考方案1】:

你的预期是正确的。两者都有

//div[text()='Quit App1']/preceding::*[3]

//div[text()='Quit App1']/preceding::div[3]

应该从你的 XML 中选择相同的元素:

<div class="function refresh_app">Refresh</div>

如果您在 Robot Framework 中看到不同的结果,请联系开发人员then report an issue。

【讨论】:

在线 XPath 测试器的结果完全一样,所以我没想到这可能是 Robot Framework 中的错误。 我刚刚在其他在线测试仪中对其进行了测试,效果很好。我会报告一个问题。感谢您的回答。

以上是关于为啥 XPath previous-sibling::*[3] 有效,而leading-sibling::div[3] 无效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 xpath 匹配这个文本节点?

为啥命名空间限定节点没有 XPath 语法?

为啥我的 XPath 选择文本不起作用?

为啥 .css 可以处理这个 Nokogiri 对象而不是 XPath? [复制]

为啥 chrome xpath 插件获取后无法定位

为啥 XPath 表达式只选择第一个元素的文本?