Dans ma page Web, il y a un div
avec un class
nommé Test
.
Comment puis-je le trouver avec XPath
?
Ce sélecteur devrait fonctionner mais sera plus efficace si vous le remplacez par votre balise adaptée:
//*[contains(@class, 'Test')]
Ou, puisque nous savons que l'élément recherché est un div
:
//div[contains(@class, 'Test')]
Mais puisque cela correspond é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 vraiment être sûr qu'il correspondra correctement, vous pouvez également utiliser la fonction normaliser-espace pour nettoyer les caractères d'espacement blancs 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 de l'élément que vous souhaitez réellement faire correspondre, à moins que vous ne souhaitiez rechercher chaque élément du document pour la condition donnée.
Le moyen le plus facile ..
//div[@class="Test"]
En supposant que vous souhaitiez trouver <div class="Test">
comme décrit.
Je ne fais que donner ceci comme réponse, comme Tomalak l'a commentée dans la réponse de meder il y a longtemps
//div[contains(concat(' ', @class, ' '), ' Test ')]
La SEULEMENT bonne façon de le faire avec XPath:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
La fonction normalize-space
supprime les espaces de début et de fin et remplace également les séquences de caractères d’espacement par un seul espace.
Si vous n'avez pas besoin de beaucoup de ces requêtes Xpath, vous pouvez utiliser une bibliothèque qui convertit les sélecteurs CSS en XPath, car les sélecteurs CSS sont généralement plus faciles à lire et à écrire que les requêtes XPath. Par exemple, dans ce cas, vous pouvez utiliser à la fois div[class~="foo"]
et div.foo
pour obtenir le même résultat.
Certaines bibliothèques que j'ai pu trouver:
Une fonction utile peut être créée à partir des réponses précédentes:
function matchClass($className) {
return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}
Ensuite, concattez simplement l'appel de fonction dans votre requête.