2009-03-16 12 views
35

J'ai une application GWT pour laquelle j'essaye d'écrire quelques tests en utilisant Selenium. J'utilise XPath pour identifier les éléments sur la page pour les tests. L'utilisation de id ne fonctionnera pas car les valeurs id sont générées automatiquement par GWT et peuvent changer. Les choses se sont bien quand je compris que je pouvais trouver les boutons de leurs étiquettes comme suit:Comment sélectionner uniquement les éléments visibles à l'aide de XPath?

//button[.='OK'] 

Cependant, quand je commencé à courir plusieurs tests que je commencé à avoir des problèmes. Je me suis rendu compte que le problème était toutes les différentes "pages" de l'application GWT une fois généré par le Javascript restent dans le HTML dans les éléments cachés <div>. Cela signifiait que mes tests Selenium cliquaient parfois sur des boutons cachés au lieu du bouton visible dans la vue actuelle.

examen du HTML avec Firebug, il semble que GWT cache les éléments <div> en ajoutant display: none à leur attribut style. Cela signifie que je peux trouver tous les boutons OK cachés comme suit:

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

Ceci trouvera tous les boutons OK cachés, i.e. les boutons qui ont un ancêtre <div> qui est caché en ayant display: none dans le style.

Ma question est: comment utiliser XPath pour trouver seulement les boutons OK visibles? Comment puis-je trouver les boutons qui n'ont aucun ancêtre <div> éléments avec display: none dans le style?

Répondre

46

Cela devrait fonctionner:

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

EDIT:

L'expression plus simple et plus efficace ci-dessous:

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

ne fonctionne pas correctement parce que chaque bouton a au moins un div qui est visible dans ses ancêtres. Selenium 2 Webdriver nous donne l'option de la méthode isDisplayed() qui s'occupe de ce problème.

+0

Voilà. Merci beaucoup. –

+1

Dernier ne fonctionne pas s'il y a une autre div dans le dom-tree qui n'est pas caché:

Fortega

+0

@Fortega et il est dit dans le texte autour de lui –

12

Beau travail par les contributeurs de sélénium.

+1

Est-ce que cela fonctionne si l'attribut caché d'affichage est sur un élément parent et non l'élément lui-même? –

+2

Oui, mais vous devez vérifier cela pour l'élément particulier, ne peut pas correspondre à la collection entière. – sitnarf

+1

Soyez prudent car cela peut déclencher des exceptions 'StaleElementReferenceException' quand les éléments sont modifiés entre la récupération (' find by * ') et la vérification de sa visibilité en utilisant' isDisplayed() '. – Blaise

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

Ce code trouverez élément visible XPath