2009-03-16 24 views
35

Tengo una aplicación GWT para la cual intento escribir algunas pruebas usando Selenium.¿Cómo selecciono solo elementos visibles usando XPath?

Estoy usando XPath para identificar los elementos en la página para las pruebas. El uso de id no funcionará ya que los valores id son generados automáticamente por GWT y pueden cambiar. Las cosas empezaron a ir bien cuando me di cuenta de que podría encontrar los botones de las etiquetas de la siguiente manera:

//button[.='OK'] 

Sin embargo, cuando empecé ejecución de varias pruebas empecé a tener problemas. Me di cuenta de que el problema era que todas las diferentes "páginas" de la aplicación GWT una vez generadas por el Javascript permanecían en el HTML en los elementos ocultos <div>. Esto significaba que mis pruebas de Selenium a veces hacían clic en los botones ocultos en lugar del botón visible en la vista actual.

Examinando el HTML con Firebug, parece que GWT oculta los elementos <div> mediante la adición de display: none a su atributo style. Esto significa que puedo encontrar todos los botones OK ocultos de la siguiente manera:

//div[contains(@style,'display: none')]//button[.='OK'] 

Esto encontrará todos los botones OK ocultos, es decir los botones que tienen un antepasado <div> que está oculto por tener display: none en el style.

Mi pregunta es: ¿cómo uso XPath para encontrar solo los botones OK visibles? ¿Cómo puedo encontrar los botones que no tienen elementos ancestros <div> con display: none en el style?

Respuesta

46

Esto debería funcionar:

.//button[.='OK' and not(ancestor::div[contains(@style,'display:none')]) 
and not(ancestor::div[contains(@style,'display: none')])] 

EDIT:

a continuación La expresión más simple y más eficiente:

//div[not(contains(@style,'display:none'))]//button[.='OK'] 

no funciona correctamente debido a que cada botón tiene al menos un div que es visible en sus antepasados

+0

Eso es todo. Muchas gracias. –

+1

El último no funciona si hay otro div en el dom-tree que no está oculto:

Fortega

+0

@Fortega y se dice en el texto alrededor de él –

12

Selenium 2 Webdriver nos da la opción del método isDisplayed() que trata este problema. Buen trabajo de los contribuyentes de selenio.

+1

¿Funciona si el atributo oculto de visualización está en un elemento principal y no en el elemento en sí? –

+2

Sí, pero debe verificar esto para el elemento particular, no puede coincidir con toda la colección. – sitnarf

+1

Tenga cuidado porque esto puede provocar excepciones 'StaleElementReferenceException' cuando los elementos cambian entre la recuperación (' find by * ') y la comprobación de su visibilidad mediante' isDisplayed() '. – Blaise

-3
//div[contains(@style,'display: block')] 

Este código se encuentra visible elemento XPath

Cuestiones relacionadas