Comment puis-je sélectionner uniquement les éléments visibles à l'aide de XPath?
J'ai un GWT application pour laquelle je suis en train d'écrire quelques tests à l'aide de Le sélénium.
Je suis à l'aide de XPath pour identifier les éléments sur la page pour les tests. À l'aide de id
ne fonctionne pas comme le id
valeurs sont générées automatiquement par GWT et peut changer. Les choses ont commencé à aller bien quand j'ai vu que je pouvais trouver les boutons par leurs étiquettes comme suit:
//button[.='OK']
Cependant, quand j'ai commencé l'exécution de plusieurs tests, j'ai commencé à avoir des problèmes. J'ai réalisé que le problème a été de toutes les différentes "pages" de l'application GWT est généré par le Javascript restent dans le code HTML de caché <div>
éléments. Cela signifiait mon Sélénium tests ont été parfois cliquant sur les boutons cachés au lieu du bouton visible dans la vue actuelle.
L'examen de l'HTML avec Firebug, il semble que GWT cache la <div>
éléments en ajoutant display: none
à leur style
attribut. Cela signifie que je peux trouver tous les renseignements cachés OK boutons comme suit:
//div[contains(@style,'display: none')]//button[.='OK']
Cela permettra de trouver tous les cachés boutons OK, j'.e les boutons qui ont un ancêtre <div>
qui est masqué par le fait d'avoir display: none
dans le style
.
Ma question est: comment puis-je utiliser XPath pour trouver uniquement la partie visible boutons OK? Comment puis-je trouver les boutons qui n'ont pas d'ancêtre <div>
éléments avec display: none
dans le style
?
Vous devez vous connecter pour publier un commentaire.
Cela devrait fonctionner:
EDIT:
Le plus simple et plus efficace de l'expression ci-dessous:
ne fonctionne pas correctement parce que chaque bouton a au moins un div qui est visible dans sa ancêtres.
class="display: none;"
n'est pas compensée par le ci-dessus (l'espace qui le rend différent).display: none
soutiendisplay: none;
est définie, ce qui rend l'élément n'est pas visible, mais encore égalé par cette expression XPath.display:none
, et un qui fait la même chose, maisdisplay: none
avec un espace.Sélénium 2 Webdriver nous donne la possibilité de le isDisplayed() méthode qui traite de ce problème. Beau travail par le sélénium contributeurs.
StaleElementReferenceException
exceptions lorsque les éléments sont modifiés entre la récupération (find by *
) et la vérification de sa visibilité à l'aide deisDisplayed()
.//div[(contains(@style,'display: block'))]//button[@id='buttonid']
Cela a fonctionné pour moi. Comme
'display: none'
représentant les blocs cachés,'display: block'
représente actuellement affichée bloc et on peut spécifier n'importe quel intérieur des balises pour être identifié comme ci-dessusCode
. Cela permettra d'apporter des réponses plus propre. plus d'infosCe code trouverez élément visible xpath
inline
,inline-block
,flex
, ...