我不得不使用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()
答案 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
注意:在上面的说明中,将节点称为元素是为了更好地理解。