我该如何计算与我的CSS选择器匹配的元素数量?

28

我正在尝试使用SeleniumRC测试我的GWT应用程序,并尝试使用CSS选择器匹配元素。

我想要计算以下HTML中启用按钮的数量。

如果一个按钮在具有 class="x-panel-btn-td "<td> 下面,那么它是可用的,如果它在具有 class="x-panel-btn-td x-hide-offsets"<td> 下面,则它被禁用。

因此,基本上,我要检索所有具有类 x-panel-btn-td<td> 下的按钮数量。

<table cellspacing="0">
    <tbody>
    <tr>
        <td id="ext-gen3504" class="x-panel-btn-td ">
            <em unselectable="on">
                <button id="ext-gen3506" class="x-btn-text" type="button">OK</button>
            </em>
        </td>
        <td id="ext-gen3512" class="x-panel-btn-td x-hide-offsets">
            <em unselectable="on">
                <button id="ext-gen3506" class="x-btn-text" type="button">Yes</button>
            </em>
        </td>
        <td id="ext-gen3520" class="x-panel-btn-td">
            <em unselectable="on">
                <button id="ext-gen3506" class="x-btn-text" type="button">No</button>
            </em>
        </td>
        <td id="ext-gen3528" class="x-panel-btn-td x-hide-offsets">
            <em unselectable="on">
                <button id="ext-gen3506" class="x-btn-text" type="button">Cancel</button>
            </em>
        </td>
    </tr>
    </tbody>
</table>

请注意,如果您正在寻找Webdriver的等效内容,请向下滚动以查看我的答案。 - HRVHackers
6个回答

15
据我所知,你不能使用CSS选择器来实现这个功能,但是Selenium有一个用于按XPath计数的命令。下面的命令将验证是否有两个禁用的按钮:
```python driver.find_elements_by_xpath("//button[@disabled]") ```
verifyXpathCount | //td[contains(@class, 'x-hide-offsets')]//button | 2

在 Selenium RC (Java) 中,这看起来更像是:

assertEquals(selenium.getXpathCount("//td[contains(@class, 'x-hide-offsets')]//button"), 2);

接受这个答案,因为在Selenium术语中更加直接。 - Nirmal Patel
1
有用,但原标题是要求CSS等效而不是XPath。 - David

14

这个功能现在也已经在Selenium Webdriver API中实现了(不需要任何额外的Javascript魔法)。由于谷歌仍然将此问题链接作为顶部结果,尽管Selenium RC已被Webdriver取代,希望这可以节省某些人的时间。

示例java代码:

int locatorElementSize = driver.findElements(By.cssSelector("yourCSSLocator")).size();

8

在较新版本的Selenium中,有一个GetCSSCount(string locator)函数。只是想更新一下这个问题可能会有用。


有人知道哪些版本的Selenium特别提供这个功能吗?在Selenium RC和WebDriver中都有吗?还是只有WebDriver? - David
还有,之前忘了问,Selenium 的哪些版本,包括服务器 JAR、客户端代码绑定和/或 IDE。 - David

2

由于Selenium是Firefox的一部分,而后者支持Selectors API,因此可以使用以下测试简化使用CSS定位器计算匹配项数量:

verifyEval | window.document.querySelectorAll("your#css > selector.here").length | 4

在这个例子中,计数被验证为4。

这对其他浏览器如IE是否有效?我们理想的情况是要一个跨浏览器的解决方案。 - David
关于这种方法需要注意的一点是,与常规的Selenium RC API命令不同,你可以省略定位器前缀"css="。 - David
感谢@soletan。很高兴知道那个兼容性矩阵。 - David

2
这应该相对简单。你可以用多种方式来完成,但我建议使用DefaultSelenium中的getEval(...)。编写一些JavaScript代码,实现以下功能:
  1. 通过id获取所有元素:ext-gen3506
  2. 遍历所有元素并检查它是否启用
  3. 如果启用,则增加计数器
  4. "返回"计数器。
通常情况下,getEval(...)将返回最后一条运行的语句的值...所以这应该可以给你计数。请注意保留HTML标记。

这些按钮不应该有相同的ID...(我复制并粘贴了那个按钮标签,因此在代码片段中显示了相同的ID。我的错。)我应该获取所有类型为button的元素。 - Nirmal Patel

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接