【问题标题】:Java based Selenium2: find element by preceding-sibling when source contains same element two times基于 Java 的 Selenium2:当源包含相同元素两次时,通过前导查找元素
【发布时间】:2014-03-27 11:08:59
【问题描述】:

我想单击带有前置兄弟节点的文本相关输入,我的 HTML 如下:

   <FORM id="formid" onsubmit="" method=post name="formid" action=>
      <TABLE width="100%">
         <TR class=foo-even>
            <TD rowSpan=3><INPUT onclick="" value=1 type=radio name="formid">upbutton1</TD>
            <TD>Pearl</TD>
            <TD rowSpan=3></TD>
         </TR>
         <TR class=foo-even>
            <TD>ravenclawn</TD>
         </TR>
         <TR class=foo-even>
            <TD>ravenclawn</TD>
         </TR>
         </TBODY>
      </TABLE>
      </TD></TR>
      <TR>
         <TD> </TD>
      </TR>
      </TBODY></TABLE>
      <TABLE width="100%" >
      <TBODY>
         <TR>
            <TD class="someclass"></TD>
         </TR>
         <TR>
            <TD>
               <TABLE class=foo width="100%" border="1px">
      <TBODY>
         <TR class=foo-header>
            <TD></TD>
            <TD><BR></TD>
            <TD colSpan=3></TD>
            <TD></TD>
         </TR>
         <TR class=foo-odd>
            <TD><INPUT value=0 type=radio name="formid.samename">buttonclick1</TD>
            <TD>1234</TD>
            <TD>blue </TD>
            <TD colSpan=2>apple2</TD>
            <TD> <INPUT value=0 type=hidden name="samenameagain"></TD>
         </TR>
         <TR class=foo-even>
            <TD><INPUT value=1 type=radio name="formid.samename">buttonclick2</TD>
            <TD>1235 </TD>
            <TD>blue </TD>
            <TD colSpan=2>apple3</TD>
            <TD> <INPUT value=0 type=hidden name="samenameagain"> </TD>
         </TR>
         <TR class=foo-odd>
            <TD><INPUT value=2 type=radio name="formid.samename">buttonclick3</TD>
            <TD>1235</TD>
            <TD>sometext </TD>
            <TD>Pearl</TD>
            <TD></TD>
            <TD> <INPUT value=0 type=hidden name="samenameagain"> </TD>
         </TR>
         <TR class=foo-even>
            <TD><INPUT value=3 type=radio name="formid.samename">buttonclick4</TD>
            <TD>1236 </TD>
            <TD>blue </TD>
            <TD colSpan=2>apple4</TD>
            <TD> <INPUT value=0 type=hidden name="samenameagain"> </TD>
         </TR>
         <TR class=foo-odd>
            <TD><INPUT value=4 type=radio name="formid.samename">buttonclick5</TD>
            <TD>1236 </TD>
            <TD>sometext </TD>
            <TD>ravenclawn</TD>
            <TD></TD>
            <TD> <INPUT value=0 type=hidden name="samenameagain"> </TD>
         </TR>
         <TR class=foo-even>
            <TD><INPUT value=5 type=radio name="formid.samename">buttonclick6</TD>
            <TD>1237 </TD>
            <TD>blue </TD>
            <TD colSpan=2>apple6</TD>
            <TD> <INPUT value=0 type=hidden name="samenameagain"> </TD>
         </TR>
         <TR class=foo-odd>
            <TD><INPUT value=6 type=radio name="formid.samename">buttonclick7</TD>
            <TD>1237 </TD>
            <TD>sometext </TD>
            <TD>ravenclawn</TD>
            <TD></TD>
            <TD> <INPUT value=0 type=hidden name="samenameagain"></tD>
   </DIV>

我的目标是点击第二个珍珠文本相关的输入字段 Selenium 代码如下:

     driver.findElement(By.xpath(".//td[contains(text(),'Pearl')][1]/preceding-sibling::td")).click();

问题: 上面的代码总是使用包含珍珠文本的第一个表

观察:

  • 当我将第一个珍珠文本修改为其他内容时,代码工作正常
  • 当我使用另一个文本 ect:"ravenclawn" 时,它可以正常工作,无需任何修改

感谢您的建议

【问题讨论】:

  • "单击第二个 Pearl 文本相关输入字段" -> 但是您的 XPath 以 td...? 结尾
  • 是的,它以 TD 结尾,但在使用 click() 命令时也可以与输入一起使用

标签: java html xpath selenium-webdriver


【解决方案1】:

您也只需包含表的索引。

For 1st table
By.xpath("//table[1]//td[contains(text(),'Pearl')]/preceding-sibling::td")

For 2nd table
By.xpath("//table[2]//td[contains(text(),'Pearl')]/preceding-sibling::td")

【讨论】:

  • 它与上面的 HTML 一起工作正常,但表格已填充,但它在最终解决方案中帮助了我,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 2015-03-11
相关资源
最近更新 更多