java - Selenium 使用 Css 在表中定位单元格

标签 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>

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

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

关于如何最好地完成这个或修复我现有的代码有什么建议吗?

最佳答案

您正试图在 CSS 选择器中使用 :contains 伪选择器。这个伪选择器不是任何已发布的 CSS 标准的一部分。不幸的是,它变得很普遍,因为 jQuery ( Sizzle ) 使用的 JavaScript CSS 选择器引擎实现允许使用它。由于驱动程序实现依赖于浏览器的 native 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();
}

请注意,此解决方案执行两次查找。分两步执行此操作使您有机会在需要时执行与包含您的值的单元格相关的其他操作。否则,您可以像这样使用单个 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 + "')]"));

关于java - Selenium 使用 Css 在表中定位单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27570746/

相关文章:

html - 在 IndexedDB 中保存 ArrayBuffer

firefox - 与远程浏览器通信时出错。它可能已经死了。 Selenium Web 驱动程序

java - 在某个字符的最后一次出现处拆分字符串

java - UniqueConstraint hibernate 和什么是目录

javascript - 识别第三方 cookie

xpath - Css 选择器等效于 '//div[contains(@class, ' a b') 而不是 (contains(@style, 'c' ))]'

python - Selenium 找不到99%的元素,为什么?

java - 如何关闭项目中iBatis和Struts2的log4j调试信息?

java - 无法读取 jar 中的图像

python - 在 Python 中运行基本的 Selenium 脚本时为 "Firefox quit unexpectedly."