¿Cómo puedo contar el número de elementos que coinciden con mi selector CSS?


Estoy tratando de usar SeleniumRC para probar mi aplicación GWT y estoy tratando de hacer coincidir elementos usando selectores CSS.

Quiero contar el número de botones habilitados en el siguiente HTML.

Un botón está habilitado si está bajo a <td> con class="x-panel-btn-td " y deshabilitado si está bajo a <td> con class="x-panel-btn-td x-hide-offsets".

Así que básicamente, quiero recuperar el número de botones bajo todos <td> s con la clase x-panel-btn-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>
Author: Jason Plank, 2009-10-15

6 answers

Por lo que sé, no puedes hacer esto usando selectores CSS, pero hay un comando en Selenium para contar por XPath. El siguiente comando verificará que hay dos botones desactivados:

verifyXpathCount | //td[contains(@class, 'x-hide-offsets')]//button | 2

En Selenium RC (Java) esto se vería más como

assertEquals(selenium.getXpathCount("//td[contains(@class, 'x-hide-offsets')]//button"), 2);
 15
Author: Dave Hunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-15 15:56:52

Esto ahora también está implementado (sin ninguna magia Javascript adicional necesaria) en Selenium Webdriver API Ya que Google todavía enlaza a esta pregunta como un resultado principal, a pesar de que Selenium RC ha sido reemplazado por Webdriver, esperemos que esto ahorre tiempo a alguien.

Ejemplo de código java:

int locatorElementSize = driver.findElements(By.cssSelector("yourCSSLocator")).size();
 11
Author: gorbysbm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-11 04:37:30

Con las versiones más recientes de Selenium, hay una función GetCSSCount(localizador de cadenas). Solo pensé que una actualización de esta pregunta sería útil

 7
Author: Raidil142,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-31 18:24:41

Esto debería ser relativamente simple. Puede hacerlo de varias maneras, pero sugeriría usar getEval(...) en DefaultSelenium.

Escribe algo de JavaScript que:

  1. obtiene todos los elementos por id: ext-gen3506
  2. itera a través de todos los elementos y comprueba si está habilitado
  3. si está habilitado, incrementa un conteo
  4. "devuelve" el conteo.

Generalmente, getEval(...) devolverá el valor de la última instrucción que se ejecutó... así que eso debería darte la contar.

 2
Author: vinnybad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-19 12:33:44

Dado que Selenium es parte de Firefox y este último es compatible con Selectors API, se podría simplificar el conteo de coincidencias de un localizador CSS utilizando una prueba como esta:

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

En este ejemplo se verifica que el conteo es 4, por supuesto.

 1
Author: soletan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-18 08:46:47

Aquí hay otra solución, usando javascript, similar a post about Selector API / window.documento.querySelectorAll:

Http://blog.eviltester.com/2010/03/a-simple-getcsscount-helper-method-for-use-with-selenium-rc.html

 0
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-04 11:30:45