【问题标题】:Not able to select a text using selenium无法使用硒选择文本
【发布时间】:2016-02-29 12:28:15
【问题描述】:

我有一个现成的代码,我正在尝试使用 selenium 为它编写测试。这就是我的代码在 chrome 的元素选项卡中的样子:

<table id="xyz">
    <tbody>
        <tr>...</tr>
        "
            I am not able to retrieve this text.
        "
    </tbody>
 </table>

在 chrome 的控制台选项卡中执行此操作 $x("//*[contains(text(),'I am not able to retrieve this text')]"); 不会显示任何结果。如果文本是在 div、span 等中定义的,我可以通过此命令获取文本。(区分大小写也不是问题)。

在代码中,使用jQuery('tbody').append( abc() ); 将文本附加到 tbody 中,abc() 函数以这种方式返回此文本 pqr.html();

现在我的问题是我应该写什么 xpath 表达式来获取这个文本?我正在寻找一个纯 xpath 表达式,即没有 java 函数等。

【问题讨论】:

  • 这是无效的 html,您不能将 textnode 作为 tbody 的子节点

标签: html selenium xpath


【解决方案1】:

contains() 期望奇异值作为第一个参数。一个 HTML 元素中可能有多个文本节点子节点,在这种情况下,您尝试的 XPath 将仅计算第一个文本节点。根据发布的示例 HTML,将评估的 &lt;tbody&gt; 的第一个文本节点由换行符和一些空格组成,因此您的 XPath 不认为 &lt;tbody&gt; 匹配并且不返回任何结果。

为避免上述问题,请在谓词中对单个文本节点使用contains(),如下所示:

//*[text()[contains(.,'I am not able to retrieve this text')]]

或者如果你想返回文本节点本身而不是父元素,可以这样:

//*/text()[contains(.,'I am not able to retrieve this text')]

【讨论】:

  • 成功了。但我遇到了另一个问题。我最初在这个问题的描述中没有提到,但是在 DOM 中有两个地方出现了这个文本。现在,当我试图从所需的位置获取文本时,它不会让我得到它。这是我正在使用的命令“//html/table[@id, 'xyz']//*/text()[contains(.,'I am not able to retrieve this text')]”和“ //html/table[@id, 'xyz']/text()[contains(.,'我无法检索此文本')]"
  • 我自己想出来的。 “/html//table[@id='xyz']//*/text()[contains(.,'我无法检索此文本')]”。感谢您的回答。它为我节省了很多精力
【解决方案2】:

table 元素可能在一个框架内。要访问框架内的内容,您需要先切换到它。您可以在 selenium 中使用“切换到”方法。请参考此answer 和此one

出于同样的原因,它在 Chrome 开发工具控制台中不起作用。在控制台选项卡中,有一个包含框架列表的下拉菜单。确保选择存在特定元素的正确框架,然后执行 XPath。

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2013-11-21
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多