【问题标题】:How to identify xpath of an element which do not have any attribute information如何识别没有任何属性信息的元素的 xpath
【发布时间】:2016-09-28 22:08:50
【问题描述】:

我想从td 标记中识别一个文本“我的门户”元素。下面是我的 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>

我在xpaths 下尝试过如下所示,但它们都不起作用:

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

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

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

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

  1. 为什么突出显示两个标签?
  2. 为什么.//td[contains(text(),"My Portal")] 不起作用?
  3. 如何唯一标识“我的门户”?

有人可以帮忙吗?

【问题讨论】:

  • 第一个问题很简单——如果你看一下两个 TD 的结构、文本内容、删除所有 html 将是相同的
  • @JaromandaX,你能告诉我如何唯一地识别相同的东西
  • 您在过去 4 小时内得到了两个答案 - 我无法回答全部 3 个,因此评论不是答案:p

标签: javascript xpath


【解决方案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']

虽然这不是很有效。如果您知道文本“我的门户”出现在 td 的直接子文本中,请尝试

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

【讨论】:

  • 感谢您的回答。第二种方法效果很好。你能解释一下not(.//table)更多吗?
【解决方案2】:

要唯一标识第二个 td,您需要添加一个额外的过滤器。因此,如果您查看突出显示的 2 个标签之间的区别,则父母有一个班级,而孩子没有。因此,如果您需要第二个 td,xpath 将是 //td[normalize-space()='My Portal' 而不是(@class='rich-table-cell')]

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

【讨论】:

    【解决方案3】:

    不要使用text() 试试.

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

    【讨论】:

    • 我已经尝试了您建议的xpath,但是显示了 4 个匹配的节点。它突出显示包含td 标签的完整层次结构
    【解决方案4】:

    回答您的问题:

    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>

    【讨论】:

    • 我已经尝试了第一个问题的答案中给出的xpath。它仍然无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2016-06-25
    • 2013-04-21
    相关资源
    最近更新 更多