使用Css在表中定位硒细胞

时间:2014-12-19 17:10:24

标签: java firefox selenium selenium-webdriver

Selenium似乎无法使用以下代码在我指定的表中找到输入元素:

driver.findElement(By.cssSelector("td:contains('Community Member')+td+td>input:contains('ACTION_DELETE')")).click();

它抛出一个InvalidSelectorException。以下是我正在使用的页面源代码行的片段:

<tr id="aui_3_2_0_1240" class="portlet-section-alternate results-row alt lfr-role lfr-role-community last">
    <td class="align-left col-1 first valign-middle" headers="issq_col-1" colspan="1"> Community Member </td>
    <td class="align-left col-2 valign-middle" headers="issq_col-2" colspan="1">
    <td id="aui_3_2_0_1239" class="align-left col-3 valign-middle" headers="issq_col-3"     colspan="1">
        <input id="aui_3_2_0_1211" type="checkbox" name="10124_ACTION_DELETE"/>
    </td>
    <td class="align-left col-4 valign-middle" headers="issq_col-4" colspan="1">
    <td class="align-left col-5 valign-middle" headers="issq_col-5" colspan="1">
    <td class="align-left col-6 valign-middle" headers="issq_col-6" colspan="1">
    <td class="align-left col-7 valign-middle" headers="issq_col-7" colspan="1">
    <td class="align-left col-8 valign-middle" headers="issq_col-8" colspan="1">
    <td class="align-left col-9 last valign-middle" headers="issq_col-9" colspan="1">
</tr>

我正在尝试智能地点击上面输入元素表示的复选框。我应该注意,上面的所有td也可以扩展以显示输入元素。理想情况下,我想要的只是一些代码,我可以给出行中第一个单元格的值以及复选框名称的一部分,然后单击我的复选框。在上面的示例中,就像......

clickCheckboxInTable("Community Member","ACTION_DELETE");

有关如何最好地完成此操作或修复现有代码的任何建议?

3 个答案:

答案 0 :(得分:5)

您尝试在CSS选择器中使用:contains伪选择器。此伪选择器不是任何已发布的CSS标准的一部分。不幸的是,它变得很常见,因为jQuery(Sizzle)使用的JavaScript CSS选择器引擎实现允许它被使用。由于驱动程序的实现依赖于浏览器&#39;原生CSS选择器引擎实现,他们不支持:contains伪选择器,并抛出您正在看到的异常。此外,我注意到您正在尝试找到其中name属性(而不是元素内容)包含您要搜索的字符串的复选框。在这种情况下,:contains无论如何都不会工作。

不考虑使用其中包含的文本查找元素的固有不稳定性,如果您真的想这样做,通过XPath查找可能是您唯一的选择。此外,复选框元素不是包含您要查找的文本的元素的后代。相反,它是一个兄弟元素,CSS选择器不允许您将DOM树向上移动到父元素。同样,这是XPath最好处理的功能。

我使用以下内容处理问题:

public void clickCheckboxInTable(String value, String action) {
  // Assume the WebDriver instance is stored in a class-level
  // variable named 'driver'.
  WebElement tableCell = driver.findElement(By.xpath("//td[contains(., '" + value + "')]"));
  WebElement checkbox = tableCell.findElement(By.xpath("..//input[contains(@name, '" + action + "')]"));
  checkbox.click();
}

请注意,此解决方案会执行两次查找。通过两个步骤执行此操作,您可以根据需要执行与包含值的单元格相关的其他操作。否则,您可以使用单个XPath表达式,如下所示:

// Using the 'direct parent' operator ('..'), but you could also
// use other axis functions like 'following-sibling'.
findElement(By.xpath("//td[contains(., '" + value + "')]/..//input[contains(@name, '" + action + "')]"));

答案 1 :(得分:0)

尝试使用此Xpath:

//*[@type='checkbox'][contains(@name,'_ACTION_DELETE')]

修改

//*[normalize-space(text())='Community Member']/input[@type='checkbox'][contains(@name,'_ACTION_DELETE')]

enter image description here

编辑:在Jim Evans发表评论后更正了

//*[normalize-space(text())='Community Member']/..//input[@type='checkbox'][contains(@name,'_ACTION_DELETE')]

答案 2 :(得分:0)

尝试使用此 xpath点击与“社区会员”相关的复选框:

driver.findElement(By.xpath("//td[contains(text(),'Community Member')]/following-sibling::td/input[contains(@name,'ACTION_DELETE')]")).click();