xpath previous-sibling正确

时间:2015-07-09 13:36:41

标签: html xpath selenium-webdriver

<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();

3 个答案:

答案 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();