包含特定文本的另一个元素的XPath是什么?

5

我知道如何定位 button 内部的 div

//button/div[contains(text(),'Save')]

我想知道是否可能定位包含文本“Save”的div的任何按钮?
<button class="PinBetterSave__Button" data-test-id="PinBetterSaveButton"><div class="_w7 _0 _1 _2 _wa _36 _d _b _6">Save</div></button>
2个回答

5

你可以尝试

//button[contains(div,'Save')]

要查找包含特定文本的 div 子元素的 button,请使用子代选择器

要查找包含特定文本的 div 后代元素的 button,请使用后代选择器

//button[contains(.//div,'Save')]

警告:提供的两个XPath都存在问题。这些问题是微妙的、常见的错误,目前被OP忽略了,他接受了这个答案,还有5个盲目支持表面正确的人。 - kjhughes

3

关于其他当前接受的答案的问题:请注意,其他答案中的两个XPath都存在问题:

  1. //button[contains(div,'Save')] 在这种情况下可以工作,但请注意,当

    • button 包含一个 span 或另一个或没有元素,而不是一个 div 时,它将失败。
    • 存在其他带有包含子字符串 "Save" 的 div 元素的按钮: "Save this""Save that""Jesus Saves" 等。
  2. //button[contains(.//div,'Save')] 在这种情况下也可以工作,但请注意,如果有多个 div 后代,则会失败,并且

    • XPath 1.0: Save div 不是第一个 div
    • XPath 2.0+: 将超过一个项(在此情况下为 div 元素)的序列作为 contains() 的第一个参数传递是错误的。

考虑使用以下XPath:

//button[normalize-space() = 'Save']

这将选择空间规范化字符串值完全为"Save"button元素。

或者,如果进行子字符串测试:

//button[contains(., 'Save')]

另请参阅


谈论“问题” :) 你的警告是有意义的,然而建议的解决方案并没有真正解决 OP 的问题,因为 //button[normalize-space() = 'Save'] 只有在 button(而不是它的子元素 div)的文本内容(忽略起始和尾随空格)等于(而不是包含)特定文本时才有效,而 //button[contains(., 'Save')] 也无法回答“如何定位任何包含文本 'Save' 的 div 内部的按钮?”的问题。 - JaSON
@JaSON: 错误。正如我在“另请参见”链接中所解释的那样,“contains”有两个含义,而问问题者经常混淆这两个含义。在这里,我非常小心地提供了覆盖最可能需求的解决方案:精确匹配(第一个XPath)和子字符串包含(第二个匹配)。任何在这个领域遇到麻烦的人都不是在寻找特定的“div”子元素或后代元素;他们受到如何基于其字符串值选择目标元素的影响,而不考虑任何可能存在的附加标记。 - kjhughes
仅仅因为你认为如果 OP 提出一个问题,那么 OP 的意思不是确切地所问的,而是其他东西,就认为这是错误的吗?:) 而且所有寻找相同答案的人也意味着其他东西...有趣的假设,但在我看来,这是一条通向无处的道路:)) - JaSON
1
@JaSON:你总是能够很好地接受反馈,除非你的答案已经完美无缺。我在这里未能说服你,这一定是我解释不足之处。如果我能想到更好的解释方式超出了我在这里和链接答案中所说的内容,我会再试一次。 - kjhughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接