Dans ma page Web, il y a un div
avec un class
nom Test
.
Comment puis-je le trouver avec XPath
?
Dans ma page Web, il y a un div
avec un class
nom Test
.
Comment puis-je le trouver avec XPath
?
Réponses:
Ce sélecteur devrait fonctionner mais sera plus efficace si vous le remplacez par votre balisage adapté:
//*[contains(@class, 'Test')]
Ou, puisque nous savons que l'élément recherché est un div
:
//div[contains(@class, 'Test')]
Mais comme cela correspondra également à des cas comme class="Testvalue"
ou class="newTest"
, la version de @ Tomalak fournie dans les commentaires est meilleure :
//div[contains(concat(' ', @class, ' '), ' Test ')]
Si vous souhaitez être vraiment certain qu'il correspondra correctement, vous pouvez également utiliser la fonction normaliser l'espace pour nettoyer les espaces blancs parasites autour du nom de la classe (comme mentionné par @Terry):
//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]
Notez que dans toutes ces versions, le * devrait être remplacé par le nom d'élément que vous souhaitez réellement faire correspondre, sauf si vous souhaitez rechercher chaque élément du document pour la condition donnée.
//div[contains(concat(' ', @class, ' '), ' Test ')]
- Le vôtre affichera également des correspondances partielles.
Le moyen le plus simple ..
//div[@class="Test"]
En supposant que vous vouliez trouver <div class="Test">
comme décrit.
//
non seulement /
.
La SEULE bonne façon de le faire avec XPath:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
La fonction normalize-space
supprime les espaces blancs de début et de fin et remplace également les séquences de caractères d'espaces blancs par un seul espace.
Si vous n'avez pas besoin de beaucoup de ces requêtes Xpath, vous voudrez peut-être utiliser une bibliothèque qui convertit les sélecteurs CSS en XPath, car les sélecteurs CSS sont généralement beaucoup plus faciles à lire et à écrire que les requêtes XPath. Par exemple, dans ce cas, vous pouvez utiliser les deux div[class~="Test"]
et div.Test
pour obtenir le même résultat.
Quelques bibliothèques que j'ai pu trouver:
Je fournis simplement ceci comme une réponse, comme Tomalak a fourni un commentaire à la réponse de Meder il y a longtemps
//div[contains(concat(' ', @class, ' '), ' Test ')]
concat(' ', normalize-space(@class), ' ')
de toutes les sortes de caractères d'espace blanc?
//div[contains(concat(' ', @class, ' '), ' Test ')]/chid
ne sélectionne- t- il pas les enfants?
Une fonction utile peut être établie à partir des réponses précédentes:
function matchClass($className) {
return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}
Concattez ensuite l'appel de fonction dans votre requête.
vous pouvez trouver des éléments comme cet exemple (tous les éléments css)
private By
allElementsCss = By.xpath(".//div[@class]");