Comment sélectionner uniquement les éléments visibles à l’aide de XPath?

J’ai une application GWT pour laquelle j’essaie d’écrire des tests avec Selenium .

J’utilise XPath pour identifier les éléments de la page pour les tests. Utiliser id ne fonctionnera pas car les valeurs d’ id sont générées automatiquement par GWT et peuvent changer. Les choses ont bien commencé quand j’ai réalisé que je pouvais trouver des boutons par leurs étiquettes comme suit:

 //button[.='OK'] 

Cependant, lorsque j’ai commencé à exécuter plusieurs tests, j’ai commencé à avoir des problèmes. J’ai réalisé que le problème était que toutes les différentes “pages” de l’application GWT, une fois générées par le Javascript, restaient dans le HTML dans les éléments

cachés. Cela signifiait que mes tests Selenium cliquaient parfois sur des boutons masqués au lieu du bouton visible dans la vue actuelle.

En examinant le HTML avec Firebug , il semble que GWT cache les éléments

en ajoutant display: none à leur atsortingbut de style . Cela signifie que je peux trouver tous les boutons OK cachés comme suit:

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

Cela trouvera tous les boutons OK cachés, c.-à-d. Les boutons qui ont un ancêtre

qui est caché en ayant un display: none dans le style .

Ma question est la suivante: comment utiliser XPath pour trouver uniquement les boutons OK visibles? Comment trouver les boutons qui n’ont pas d’éléments ancêtres

avec display: none dans le style ?

Cela devrait fonctionner:

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

MODIFIER:

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

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

ne fonctionne pas correctement car chaque bouton a au moins une div visible dans ses ancêtres.

Selenium 2 Webdriver nous donne l’option de la méthode isDisplayed () qui traite ce problème. Beau travail des consortingbuteurs au selenium.

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

Ce code trouvera l’élément xpath visible