在WebDriver

时间:2016-07-15 18:48:01

标签: selenium

我想在以下位置选择基于“Costco Wholesale Corporation”值的复选框:

<td role="gridcell" style="" title="" aria-describedby="entity-search-grid_selected">
  <input type="checkbox" name="chkbox" class="itmchk" value="110504">
</td>
<td role="gridcell" style="font-weight: bold;" title="Costco Wholesale Corporation" aria-describedby="entity-search-grid_name">
  <div class="tree-wrap tree-wrap-ltr" style="width:18px;">
    <div style="left:0px;" class="ui-icon ui-icon-triangle-1-s tree-minus treeclick"></div>                                         
  </div>
  <span class="cell-wrapper">Costco Wholesale Corporation</span>
</td>

我尝试过以下代码:

driver.findElement(By.xpath("//td[span[text()='Costco Wholesale Corporation']]/preceding-sibling::td/input[@name='chkbox'"));

但获得以下异常:

  

无效的选择器:无法找到具有xpath表达式的元素// td [span [text()='Costco Wholesale Corporation']] / preceding-sibling :: td / input [@ name ='chkbox'因为以下错误:SyntaxError:无法对'Document'执行'evaluate':字符串'// td [span [text()='Costco Wholesale Corporation']] / preceding-sibling :: td / input [@ name = 'chkbox''

你能帮忙编写xpath选择器。

3 个答案:

答案 0 :(得分:1)

您的第一个问题是xpath td[span[text()肯定无效。请记住,[...]语法仅适用于过滤器,不适用于定义路径。所以它必须是:

//td/span[text...

此外,由于您首先选择span,因此您需要返回td级别,然后选择兄弟姐妹:

//td/span[text()='Costco Wholesale Corporation']/../preceding-sibling::td/input[@name='chkbox']

鉴于您的HTML,您还可以简化它以选择td byt title,然后选择其兄弟:

//td[@title='Costco Wholesale Corporation']/preceding-sibling::td/input[@name='chkbox']

答案 1 :(得分:0)

我想知道你为什么要使用xpath。当有人改变网站的结构时,整个选择器将毫无价值。我真的建议你尽可能坚持使用css选择器。在这种情况下,它只是:

driver.findElement(By.css("input[name='chkbox'][value='110504']"));

这种方法的主要优点是只有与元素直接相关的更改才会强制您更改选择器。

当然,如果网站的某些部分没有向我们展示并且可能在选择器上有影响,那么我的选择器可能无效。但即便如此,我相信有一种方法可以使用css更直接地获取元素。

答案 2 :(得分:0)

您提供的xPath在语法上是不正确的...请尝试使用xPath下方: -

String xPath = "//span[text()='Costco Wholesale Corporation']/preceding::input[@name='chkbox']";

 driver.findElement(By.xpath(xPath));

希望它有帮助...:)