【问题标题】:Why doesn't my XPath expression return any results?为什么我的 XPath 表达式不返回任何结果?
【发布时间】:2022-01-07 06:49:30
【问题描述】:

我有以下html:

<html>
  <body>
    <table>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
        <td>Color Digest </td>
        <td>AgArAQICGQMVBBwTIRQHIwg0GUMURAZTBWQJcwV0AoEDAQ </td>
      </tr>
      <tr>
        <td>Color Digest </td>
        <td>2,43,2,25,21,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, </td>
      </tr>
    </table>
  </body>
</html>

以及以下 xpath:

tr[td='Color Digest']/td

我得到的结果为零。 谁能解释一下原因?

【问题讨论】:

    标签: selenium selenium-webdriver xpath automation


    【解决方案1】:

    xPath 表达式中,我们也可以使用属性名称和标签名称(当它有文本时)。这里&lt;tr&gt;&lt;td&gt; 都是标签名称。有效的xPath 表达式如下,

    //tagname[@attributeName='value']
    

    //tagname[@tagname='text']
    

    td 里面只有文字,所以你需要写xPath 喜欢

    //td[text()='Color Digest ']
    

    //tr[td='Color Digest ']
    

    如果您需要使用特定元素,请使用如下匹配号,

    (//td[text()='Color Digest '])[1]
    

    (//tr[td='Color Digest '])[1]
    

    为什么它显示 0 与您的 xPath 匹配?

    Digest 的末尾没有给 空格

    你的

    //tr[td='Color Digest']/td
    

    更正一个

    //tr[td='Color Digest ']/td
    

    【讨论】:

    • 但是我想成为父母的'tr'怎么办?
    • tr 是父标签,即使有父标签你也可以构造 xPath //tr//td[text()='Color Digest ']
    • 非常感谢。但我正在查看论坛中的另一个帖子,发现它应该可以工作:stackoverflow.com/questions/11657223/…。你能解释为什么它在那里工作吗?
    • 抱歉.. 我更新了我的解决方案。
    【解决方案2】:

    您的 XPath 存在一些问题

    tr[td='Color Digest']/td
    ^ 1
       ^ 2
                         ^ 3
    
    1. XPath 应该以/(子)或//(子)开头。 Child 基本上意味着向下一层,而后代意味着向下一层或多层。

      tr 在这种情况下应该是 //tr,因为没有根 TR。

    2. 您使用了td,而您似乎打算使用.text(),这表示元素中的文本有两种变体。 . 表示压缩所有后代节点的包含文本,text() 表示仅当前节点的包含文本。

      text(). 在这种情况下都可以使用,但为了安全起见,我通常会使用 text()

      [td='Color Digest'] 应该是[text()='Color Digest']

    3. 如果您查看您提供的 HTML,第一个 TD 中的文本实际上在末尾包含一个空格,例如“颜色文摘”与“颜色文摘”。除非您使用像 contains() 这样的函数,否则该空间是必需的。

      [td='Color Digest'] 应该是[text()='Color Digest ']

    4. 对于最后一个,我不确定你到底在寻找什么,/td

      对于包含“Color Digest”文本的 TD,它没有子级。如果您指的是同级 TD,则需要 /following-sibling

      /td 应该是/following-sibling::td[1]

    把所有这些放在一起,

    //tr[text()='Color Digest ']/following-sibling::td[1]
    

    它会返回以下元素

    <td>AgArAQICGQMVBBwTIRQHIwg0GUMURAZTBWQJcwV0AoEDAQ </td>
    <td>2,43,2,25,21,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...</td>
    

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 1970-01-01
      • 2017-11-27
      • 2013-02-24
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多