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");
有关如何最好地完成此操作或修复现有代码的任何建议?
答案 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')]
编辑:在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();