为什么我的XPath不会根据标签文本选择链接/按钮?

时间:2017-09-29 10:03:04

标签: html xml selenium xpath

<a href="javascript:void(0)" title="home">
    <span class="menu_icon">Maybe more text here</span>
    Home
</a>

因此,对于上面的代码,当我将//a写为XPath时,它会突出显示,但是当我写//a[contains(text(), 'Home')]时,它不会突出显示。我认为这很简单,应该有效。

我的错误在哪里?

3 个答案:

答案 0 :(得分:4)

其他答案错过了实际问题:

  1. 是的,您可以在var input = document.body.appendChild(document.createElement("input")); input.onchange = input.onkeydown = input.onkeyup = function() { input.value = input.value.replace(/\D/igm, ''); };上匹配,但这不是OP的原因 XPath在以前可能已经运行的地方失败了。
  2. 是的,XML和XPath区分大小写,因此@title与...不同 Home,但有一个home文本节点作为Home的子节点,因此OP是 如果他不信任a在场,则有权使用Home
  3. 真正的问题

    OP的XPath,

    @title

    表示选择第一个文本节点包含子串//a[contains(text(), 'Home')] 的所有a个元素。然而,第一个文本节点只包含空格。

    说明: Home选择上下文节点text()的所有子文本节点。当a被赋予多个节点作为其第一个参数时,它将获取 第一个 节点的字符串值,但contains()出现在第二个文本中节点,而不是第一个。

    相反,OP应该使用此XPath,

    Home

    表示使用 任何 文本子项选择所有//a[text()[contains(., 'Home')]] 元素,其字符串值包含子字符串a

    如果没有周围的空格,可以使用此XPath来测试相等而不是子字符串包含:

    Home

    或者,对于周围的空格,可以使用此XPath将其修剪掉:

    //a[text()[.='Home']]
    

    另见:

答案 1 :(得分:1)

你可以试试这个XPath ..它只是按属性选择元素

 //a[@title,'home']

答案 2 :(得分:1)

是的,你正在犯2个错误,当你想要Home与小写字母h匹配时,你正在用大写字母H写home。当你想检查“标题”属性时,你也试图检查文本内容。纠正那些2,你得到:

//a[contains(@title, 'home')]

但是,如果您想匹配确切的字符串home,而不是标题属性中任何位置home的匹配项,请使用@ zsbappa的代码。