【问题标题】:How can I get the XPATH of elements under all rows of the same rowspan?如何在同一行跨度的所有行下获取元素的 XPATH?
【发布时间】:2022-06-30 23:58:35
【问题描述】:

测试数据:

<table>
    <tbody>
        <tr>
            <td rowspan="3">A1</td>
            <td ><span class="searching_for_this"> AA1</span></td>
            <td ><span class="not_searching_for_this">AA2</span></td>
        </tr>
        <tr>
            <td ><span class="searching_for_this"> AA3 </span></td>
            <td ><span class="not_searching_for_this">AA3 </span></td>
        </tr>        
        <tr>
            <td ><span class="searching_for_this"> AA1 </span></td>
            <td ><span class="not_searching_for_this">AA4 </span></td>
        </tr>

        <tr>
            <td rowspan="3">B1</td>
            <td ><span class="searching_for_this"> BB1</span></td>
            <td ><span class="not_searching_for_this">BB2</span></td>
        </tr>
        <tr>
            <td ><span class="searching_for_this"> AA1 </span></td>
            <td ><span class="not_searching_for_this">BB3 </span></td>
        </tr>        
        <tr>
            <td ><span class="searching_for_this"> BB2 </span></td>
            <td ><span class="not_searching_for_this">BB3 </span></td>
        </tr>
    </tbody>
</table>

场所:

  1. 我知道3 rowspan 所在行和列的内容,(在本例中为A1)。
  2. 我现在是我要查找的类的一个元素的内容,在这种情况下为AA1 和searching_for_this。
  3. 我想在A1 的行跨度下获取AA1 的行(tr)。所以结果将是第一行和第三行。

第一次尝试: 所以在单行场景中,这将是这样的:

  1. 主行://tr[td[contains(text(), 'A1')]]
  2. 从行中搜索子项(相对搜索.//): .//tr[td/span[class=searching_for_this and contains(text(), 'AA1')]]

问题: 在这种行跨度场景中,我不知道如何在不包括 colspan 之外的行的情况下让所有元素都考虑到 colspan 之后的“下一行” (B1)。

【问题讨论】:

    标签: selenium xpath html-table


    【解决方案1】:

    这个 XPath-1.0 表达式有点复杂。它由两部分组成:

    1. 第一个谓词选择第一个&lt;tr&gt; 之间的节点,该&lt;td&gt; 子节点具有所需的属性,下面的&lt;tr&gt; 具有rowspan=3 属性(第一部分仅选择第一个匹配元素):

      [td[@rowspan='3' and text()='A1'] or not(td/@rowspan='3') and count(preceding-sibling::tr[td/@rowspan='3'])=1]
      
    2. 第二个谓词过滤上述节点集以查找满足所需条件的元素 - 这些元素具有 td/@class 属性子级,带有“searching_for_this”和文本内容“AA1”。

    所以完整的表达式可以是

    //tr[td[@rowspan='3' and text()='A1'] or not(td/@rowspan='3') and count(preceding-sibling::tr[td/@rowspan='3'])=1]/td[span/@class='searching_for_this' and normalize-space(.)='AA1']
    

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2015-01-03
      • 2017-12-24
      • 1970-01-01
      • 2018-12-20
      • 2022-11-22
      相关资源
      最近更新 更多