<table width="100%" cellpadding="2" border="0" cellspacing="0">
<tbody>
<tr>
<tr>
<td valign="top" align="left" style="width:2%">
<input id="ucRightAdd_grdList_ctl04_chkSelect" type="checkbox" name="ucRightAdd$grdList$ctl04$chkSelect">
</td>
<td width="65%" valign="top">
<span class="BodyText"> Workflow View </span>
</td>
在上面的html代码中,我需要选中与文本Workflow View
对应的复选框。我使用了以下代码,但它不起作用:
Driver.findElement(By.xpath("//span[contains(., \"" +rightName+ "\")]../preceding-sibling::/td/input[@type='checkbox']")).click();
答案 0 :(得分:1)
您可以使用XPath
//span[contains(text(), "Workflow View")]/../preceding-sibling::td/input[@type="checkbox"]
请注意
text()
中使用contains(text(), "Workflow View")
获取span
标记内的文字。[contains(text(), "Workflow View")]
preceding-sibling::
和td
之间不应有正斜杠。 或者,您也可以考虑使用
//span[contains(text(), "Workflow View")]/preceding::input[@type="checkbox"]
这有点简单,但也有不同的含义。 preceding
轴遍历当前节点排除祖先之前的所有标记:
>>> doc.xpath('//span[contains(text(), "Workflow View")]/preceding::*')
[<Element tr at 0x7ff01f819f18>,
<Element td at 0x7ff01f819e68>,
<InputElement 7ff01f819f70 name='ucRightAdd$grdList$ctl04$chkSelect' type='checkbox'>]
答案 1 :(得分:0)
如果每行有一个输入,则可以使用以下简单的xpath:
//tr[normalize-space(.)='Workflow View']/td/input
答案 2 :(得分:0)
这是旧的,但我认为你的问题在于前一个兄弟轴之后的斜线。根据W3Schools,你需要在双冒号之后进行节点测试:axisname :: nodetest [predicate]
所以而不是:
Driver.findElement(By.xpath("//span[contains(., \"" +rightName+ "\")]../preceding-sibling::/td/input[@type='checkbox']")).click();
这样做:
Driver.findElement(By.xpath("//span[contains(., \"" +rightName+ "\")]../preceding-sibling::td/input[@type='checkbox']")).click();