【问题标题】:xpath not finding text inside <div><span>xpath 在 <div><span> 中找不到文本
【发布时间】:2014-10-01 02:56:54
【问题描述】:
.//*[contains(text(), "Apply")]
<input type="hidden" value="false" name="needsValidation"/>
<input type="hidden" value="false" name="fullValidationPerformed"/>
<div class="loadingBox hidden">
<div class="paneContent">
<div class="topButtons">
    <div class="rightSide">
    <div id="saveChangesButton" class="majorButton">
        <div>
            <div>
                <div>
                    <span class="hidden"/>
                    Apply Changes
                    <span class="down"/>
                </div>
            </div>
        </div>
    </div>
</div>

为什么我创建的 xpath 字符串在这里找不到“Apply”?看来,我的 xpath 语句仅在我要查找的文本位于这样的“div”标签内的“span”标签内时才会失败。

有人可以帮我理解我在这里缺少什么吗?

【问题讨论】:

  • 用 . (句号)
  • "用 .(句点)更改文本?"我不明白。你能解释一下吗?
  • 您的测试是试图找到要单击的按钮还是断言文本包含“应用”一词?查看 saucelabs.com/resources/selenium/css-selectors 获取有关 Selenium 选择器的出色备忘单。
  • .//*[contains(text(), "Apply")] 应该是这样的:.//*[contains(., "Apply")]
  • @poodled - 有效,除了它返回 7 个匹配节点 - 每个节点都包含一个包含此字符串的节点。即表单节点,每个 div 节点都包含一个 div 节点,该 div 节点最终包含字符串“Apply Changes”。我知道我可以使用索引来到达所需的节点,但我试图使其尽可能独立于实现,因此如果开发人员更改 UI 实现,我们没有太多工作要做来更新我们的测试脚本。

标签: selenium xpath


【解决方案1】:

contains(text(), 'Apply') 不起作用的原因是该元素有多个文本节点,而 XPath 1.0 中的 contains 函数会忽略除第一个之外的所有文本节点。 (如果有多个,XPath 2.0 会给你一个错误)。

如果你想获取一个字符串值包含'Apply'的元素而不返回它的祖先,最简单的方法是获取包含这个字符串的最后一个元素:

(//*[contains(., 'Apply')])[last()]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2015-08-03
    • 2015-03-03
    相关资源
    最近更新 更多