J'ai un problème pour sélectionner des nœuds par attribut lorsque les attributs contiennent plus d'un mot. Par exemple:
<div class="atag btag" />
Voici mon expression xpath:
//*[@class='atag']
L'expression fonctionne avec
<div class="atag" />
mais pas pour l'exemple précédent. Comment puis-je sélectionner le <div>
?
div.atag
oudiv.btag
. Super simple, pas de correspondance de chaîne, et beaucoup plus rapide (et mieux pris en charge dans les navigateurs). XPath (contre HTML) devrait être relégué à ce qui est utile pour ... trouver des éléments par du texte contenu et pour la navigation DOM.Réponses:
Voici un exemple qui trouve des éléments div dont className contient
atag
:Voici un exemple qui trouve des éléments div dont className contient
atag
etbtag
:Cependant, il trouvera également des correspondances partielles comme
class="catag bobtag"
.Si vous ne voulez pas de correspondances partielles, voir la réponse de bobince ci-dessous.
la source
<div class="Patagonia Halbtagsarbeit">
, qui contient les chaînes cibles mais n'est pas un div avec les classes données.La réponse de mjv est un bon début mais échouera si atag n'est pas le premier nom de classe répertorié.
L'approche habituelle est plutôt lourde:
cela fonctionne tant que les classes sont séparées par des espaces uniquement, et non par d'autres formes d'espaces. C'est presque toujours le cas. Si ce n'est pas le cas, vous devez le rendre encore plus lourd:
(La sélection par des chaînes séparées par un espace de type nom de classe est un cas si courant qu'il est surprenant qu'il n'y ait pas de fonction XPath spécifique pour elle, comme «[class ~ =" atag "]» de CSS3.)
la source
essaye ça:
//*[contains(@class, 'atag')]
la source
grabatagonabag
? (Indice: cela correspondra toujours.)EDIT : voir la solution de bobince qui utilise contient plutôt que de commencer , avec une astuce pour s'assurer que la comparaison est effectuée au niveau d'un jeton complet (de peur que le modèle `` atag '' ne soit trouvé dans le cadre d'une autre `` balise '').
"atag btag" est une valeur étrange pour l'attribut class, mais jamais le moins, essayez:
la source
Un XPath 2.0 qui fonctionne:
ou avec une variable:
la source
@class
a plus d'un élément? Parce qu'il va retourner une liste de mots et la comparer à une chaîne échoue avec une mauvaise cardinalité .//*[tokenize(@class)=$classname]
//*[@class=$classname]
Sachez que la réponse de bobince pourrait être trop compliquée si vous pouvez supposer que le nom de classe qui vous intéresse n'est pas une sous-chaîne d'un autre nom de classe possible . Si cela est vrai, vous pouvez simplement utiliser la correspondance de sous-chaîne via la fonction contains. Ce qui suit correspondra à tout élément dont la classe contient la sous-chaîne 'atag':
Si l'hypothèse ci-dessus ne se vérifie pas, une correspondance de sous-chaîne correspondra aux éléments que vous n'avez pas l'intention. Dans ce cas, vous devez trouver les limites des mots. En utilisant les délimiteurs d'espace pour trouver les limites des noms de classe, la deuxième réponse de bobince trouve les correspondances exactes:
Cela correspondra
atag
et nonmatag
.la source
Pour ajouter à la réponse de bobince ... Si n'importe quel outil / bibliothèque que vous utilisez utilise Xpath 2.0, vous pouvez également le faire:
count () est apparemment nécessaire car index-of () renvoie une séquence de chaque index auquel il a une correspondance dans la chaîne.
la source
$classname
variable entre guillemets? Parce que tel qu'il est, c'est une chaîne.'$classname'
de chaîne bien sûr.Vous pouvez essayer ce qui suit
By.CssSelector("div.atag.btag")
la source
Je suis venu ici à la recherche d'une solution pour Ranorex Studio 9.0.1. Il n'y a pas encore de contient (). Au lieu de cela, nous pouvons utiliser l'expression régulière comme:
la source
Pour les liens qui contiennent des URL communes doivent se consoler dans une variable. Essayez ensuite séquentiellement.
la source