element.getText()方法在java selenium中不起作用

Lok*_*lli 1 java selenium xpath selenium-webdriver

<span class="label label-danger" style="font-size : 13px; font-weight : 400;">Critical</span>
Run Code Online (Sandbox Code Playgroud)

下面是我使用的xpath:

.//tr[@data-index='0']/td/span
Run Code Online (Sandbox Code Playgroud)

我在上面的HTML源代码中有一行代码.所以,我使用了相应的Xpath和used getText()方法来获取文本,即Critical.我成功了.

但是,我在另一个页面中有另一行这样的.

<div class="col-xs-12">
<div id="project-update-success-information" class="panel-confirmation success" style="display: none;">
<span class="fa fa-check"/>
  Project Updated
</div>
Run Code Online (Sandbox Code Playgroud)

下面是我使用的xpath: -

.//*[@id='project-update-success-information']/span
Run Code Online (Sandbox Code Playgroud)

我使用了相应的Xpath getText(),但不幸的是它没有为我检索文本.我怀疑</span>第二行中没有关闭标签导致问题.有没有其他方法来获取文本?

Mat*_*ler 5

这个问题已有很多答案,但没有一个真正解释这个问题.首先,在转向真正的问题之前,让我们先解开关于自闭合元素的初步困惑:不,这不是一个像元素一样的问题

<span class="fa fa-check"/>
Run Code Online (Sandbox Code Playgroud)

没有</span>标签.没有必要指出它的结束位置,因为/>已经告诉您该元素不包含任何内容并在此时关闭.


那么我们只看一下你展示的文档的片段:

<div class="col-xs-12">
 <div id="project-update-success-information" class="panel-confirmation success" style="display: none;">
  <span class="fa fa-check"/>
  Project Updated
 </div>
</div>
Run Code Online (Sandbox Code Playgroud)

一个XPath表达式(请注意,很可能你不需要.在表达式的最开头):

//*[@id='project-update-success-information']
Run Code Online (Sandbox Code Playgroud)

将返回内部div元素及其包含的所有内容.它包含的内容完全按以下顺序排列:

  • 仅限空格的文本节点
  • 一个自闭span元素,没有属性以外的内容
  • 包含"Project Updated"的文本节点

因此,当您选择内部div和使用时.getText(),结果中最终会有2个文本节点,这一点都不足为奇.获取元素的文本内容的另一种方法是text()在XPath表达式中使用:

//*[@id='project-update-success-information']/text()
Run Code Online (Sandbox Code Playgroud)

将返回(单个元素分隔--------):

[whitespace-only text node]
-----------------------
Project Updated
Run Code Online (Sandbox Code Playgroud)

解决方案是

  1. 用于getText()检索所有文本节点,然后排除仅包含空格或节点的节点
  2. 使用直接定位文本节点的XPath表达式,并排除仅包含空格的表达式.这样做的标准方法是[normalize-space()]:

    //*[@id='project-update-success-information']/text()[normalize-space()]


请注意,通常,不能保证元素的文本内容将位于单个文本节点中.很可能您有时会遇到HTML或XML,其中元素有多个文本节点,所有这些节点都包含非空白字符,例如:

<div>
Project
<span/>
Updated
</div>
Run Code Online (Sandbox Code Playgroud)