搜索(Xpath),然后单击ABOVE和NEXT单元格

时间:2019-05-19 03:25:34

标签: python selenium xpath

我不得不使用Xpath找到一些样式 然后我必须单击上面带有不同单元格的行(不同的tr,不同的td)


<tbody>
<tr>
    <td>Random Number</td>
    <td><a>Random Title</a></td>
</tr>
<tr>
    <td>Random Number</td>
    <td><a>Random Title</a></td>
</tr>
<tr>
    <td>Random Number</td>
    <td><a>Random Title</a></td>   << 2.then go ABOVE lines and .click() NEXT td
</tr>
<tr>
    <td><em style=color:red>Random Number</em></td>   << 1. Had to find this 
    <td><a>Random Title</a></td>
</tr>
</tbody>

我尝试了以下代码,但失败了。

driver.find_element_by_xpath(
    "//tbody//tr[last()-1]//td//em[@style='color:red']//em"
).click()

1 个答案:

答案 0 :(得分:0)

这是xpath。

//tr[td/em[@style='color:red']]/preceding-sibling::tr[1]/td[2]/a

这是我上面导出的xpath的解释。 让我将xpath分成4部分

  • 查找单元格包含引用(在这种情况下为带有样式的引用)

      

    // td / em [@ style ='color:red']

  • 找到包含上述td的行(我们以该行为目标,因此我们应删除上述xpath中的//

      

    // tr [td / em [@ style ='color:red']] << ---这将实现您的第一步任务

  • 查找上一行(preceding-sibling将在当前元素的同一级别中找到所有先前的元素,因此在这种情况下,我们必须用::desired_tag来过滤所需的元素,所以我们使用了preceding-sibling::tr

      

    // tr [td / em [@ style ='color:red']] / preceding-sibling :: tr

    但是,当您说preceding-sibling::tr时,它将过滤所有先前的行,因此添加了[1],因为在这种情况下我们希望直接在前一行。如果要第二行,则必须添加[2]

      

    // tr [td / em [@ style ='color:red']] / preceding-sibling :: tr [1]

  • 查找目标链接(就像您在所需行中一样,现在您可以简单地遍历该链接)

      

    // tr [td / em [@ style ='color:red']] /之前的兄弟姐妹:: tr [1] / td [2] / a

注意:在上面的说明中,将节点称为元素是为了更好地理解。