use*_*250 1 java firefox selenium selenium-webdriver
Selenium似乎无法使用以下代码在我指定的表中找到输入元素:
driver.findElement(By.cssSelector("td:contains('Community Member')+td+td>input:contains('ACTION_DELETE')")).click();
Run Code Online (Sandbox Code Playgroud)
它抛出一个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>
Run Code Online (Sandbox Code Playgroud)
我正在尝试智能地单击上面输入元素表示的复选框.我应该注意,上面的所有td也可以扩展以显示输入元素.理想情况下,我想要的只是一些代码,我可以给出行中第一个单元格的值以及复选框名称的一部分,然后单击我的复选框.在上面的例子中,就像......
clickCheckboxInTable("Community Member","ACTION_DELETE");
Run Code Online (Sandbox Code Playgroud)
有关如何最好地完成此任务或修复现有代码的任何建议?
您正在尝试:contains在CSS选择器中使用伪选择器.此伪选择器不是任何已发布的CSS标准的一部分.不幸的是,它变得很普遍,因为jQuery(Sizzle)使用的JavaScript CSS选择器引擎实现允许它被使用.由于驱动程序实现依赖于浏览器的本机CSS选择器引擎实现,因此它们不支持:contains伪选择器,并抛出您所看到的异常.此外,我注意到您正在尝试找到名称属性(而不是元素内容)包含您要搜索的字符串的复选框.在那种情况下无论如何: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();
}
Run Code Online (Sandbox Code Playgroud)
请注意,此解决方案执行两个查找.通过两个步骤执行此操作,您可以根据需要执行与包含值的单元格相关的其他操作.否则,您可以使用单个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 + "')]"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1304 次 |
| 最近记录: |