如何识别没有任何属性信息的元素的xpath

时间:2016-09-28 04:56:11

标签: javascript xpath

我想从td标签中识别出一个文本“My Portal”的元素。下面是我的HTML

<tbody>
    <tr>
        <td>
            <!-- rendered always true, custom column names are also label -->
            My Portal 
            <!-- rendered always false, this feature is not required -->
        </td>
    </tr>
</tbody>

我在xpath下方尝试过,如下所示,但没有一个有效:

1. .//td[text()="My Portal"]
2. .//td[contains(text(),"My Portal")]

在互联网上进行一些搜索后,我找到了normalize-space()方法,该方法将删除尾随和不必要的空格。我使用下面的xpath尝试了这个方法

.//td[normalize-space()="My Portal"]

能够识别元素,但在firebug中它显示为2个匹配的节点。请在萤火虫enter image description here中找到突出显示元素的附件 我的问题是:

  1. 为什么要突出显示两个标签?
  2. 为什么.//td[contains(text(),"My Portal")]不起作用?
  3. 如何唯一地识别“我的门户”?
  4. 有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

要唯一标识第二个td,您需要做的是添加一个额外的过滤器。因此,如果您查看突出显示的2个标记之间的差异,则父级有一个类而子级没有。所以如果你需要第二个td,那么xpath将是// td [normalize-space()='My Portal'而不是(@ class ='rich-table-cell')]

如果您需要父母,那么:// td [normalize-space()='My Portal'和@ class ='rich-table-cell']

答案 1 :(得分:1)

有几种解决方案。一种有效的方法是指定从根节点到所需td的确切路径。像

这样的东西
/html/body/table/tbody/tr/td/table/tbody/tr/td[normalize-space()='My Portal']

如果您知道嵌套表不超过两个,则可以将其缩短为

//td//td[normalize-space()='My Portal']

如果您希望最内层表中的td与表结构无关,请尝试

//td[not(.//table) and normalize-space()='My Portal']

但这并不是非常有效。如果您知道文本&#34;我的门户&#34;出现在td的直接文本子项中,请尝试

//td[text()[normalize-space()='My Portal']]

答案 2 :(得分:0)

而不是使用text()尝试.

.//td[contains(.,"My Portal")]

答案 3 :(得分:0)

回答你的问题:

1-因为您正在使用全局选择器“//”,使用此选择器XPAth将在树中找到所有元素,因此如果您只想选择一个td,您应该指定路径,类似这样

/table/tbody/table/td[contains(text(),"My Portal")]

2-您正在使用它的命令应该可以工作,我已经尝试过,再次检查您的路径,也许您没有选择他的父母,或者您是从错误的路径开始。

function xpath(){
  
  var input = document.getElementById("xpath").value
  var cell = document.evaluate( input, document, null, XPathResult.ANY_TYPE, null );
  var cellvalue = cell.iterateNext();
  console.log(cellvalue);
  alert(cellvalue.data);
  
};
<html>
  <head>
    </head>
  <body>
<input type="text" id="xpath" value='//body/table/tbody/tr/td/table//td[contains(text(),"My Value")]/text()'/> <input type="button" onclick="xpath()" value="Execute"/>

<table>
  <tbody>
    <tr>
     <td>
      <table>
        <tbody>  
          <tr>
            <td>
            My Value
              </td>
          </tr>
        </tbody>
       </table>
      </td>
    </tr>
  </tbody>
</table>
    </body>
  </html>