2009-03-16 8 views
35

Ho un'applicazione GWT per la quale sto cercando di scrivere alcuni test utilizzando Selenium.Come seleziono solo elementi visibili usando XPath?

Sto usando XPath per identificare gli elementi nella pagina per i test. L'utilizzo di id non funziona poiché i valori di id vengono generati automaticamente da GWT e possono essere modificati. Le cose cominciarono ad andare bene quando ho capito che potevo trovare pulsanti per le loro etichette come segue:

//button[.='OK'] 

Tuttavia, quando ho iniziato a correre più test ho iniziato ad avere problemi. Mi sono reso conto che il problema erano tutte le diverse "pagine" dell'app GWT una volta generate dal Javascript rimangono nel codice HTML in elementi nascosti <div>. Ciò significava che i miei test al selenio a volte facevano clic sui pulsanti nascosti anziché sul pulsante visibile nella vista corrente.

Esaminando il codice HTML con Firebug, sembra che GWT nasconde i <div> elementi con l'aggiunta di display: none al loro attributo style. Questo significa che posso trovare tutti i pulsanti OK nascosti come segue:

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

Ciò trovare tutti i pulsanti OK nascosti, cioè i pulsanti che hanno un antenato <div> che è nascosto da avere display: none nel style.

La mia domanda è: come utilizzare XPath per trovare solo i pulsanti OK visibili? Come faccio a trovare i pulsanti che non hanno antenati elementi <div> con display: none nello style?

risposta

46

Questo dovrebbe funzionare:

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

EDIT:

L'espressione più semplice e più efficiente sotto:

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

non funziona correttamente perché ogni tasto ha almeno un div che è visibile nei suoi antenati.

+0

Questo è tutto. Grazie molto. –

+1

L'ultimo non funziona se c'è un'altra div nella dom-tree che non è nascosta:

Fortega

+0

@Fortega e si dice nel testo attorno ad esso –

12

Selenium 2 Webdriver ci offre l'opzione del metodo isDisplayed() che si occupa di questo problema. Bel lavoro da parte dei contributori del selenio.

+1

Funziona se l'attributo nascosto di visualizzazione si trova su un elemento padre e non sull'elemento stesso? –

+2

Sì, ma è necessario verificarlo per l'elemento specifico, non può corrispondere all'intera collezione. – sitnarf

+1

Fai attenzione perché questo può generare eccezioni 'StaleElementReferenceException' quando gli elementi vengono modificati tra il recupero (' find by * ') e il controllo della sua visibilità usando' isDisplayed() '. – Blaise

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

Questo codice troverà visibile elemento XPath