Utilisation de XPATH pour rechercher du texte contenant & amp; nbsp;
Question
J'utilise le navigateur XPather pour vérifier mes expressions XPATH sur une page HTML.
Mon objectif final est d'utiliser ces expressions dans Selenium pour tester mes interfaces utilisateur.
J'ai un fichier HTML avec un contenu similaire à celui-ci:
<tr> <td>abc</td> <td> </td> </tr>
Je souhaite sélectionner un nœud avec un texte contenant la chaîne " & amp; nbsp;
".
Avec une chaîne normale telle que " abc " Il n'y a pas de problème. J'utilise un XPATH semblable à // td [text () = "abc")
.
Lorsque j'essaie avec un XPATH tel que // / td [text () = "& amp; nbsp; &]]
cela ne retourne rien. Existe-t-il une règle spéciale concernant les textes avec " & amp;
" ?
La solution
Il semble que OpenQA , qui est à l'origine de Selenium, ait déjà résolu ce problème. Ils ont défini certaines variables pour correspondre explicitement aux espaces. Dans mon cas, je dois utiliser un XPATH semblable à // td [text () = "$ {nbsp}",
.
J'ai reproduit ici le texte d'OpenQA concernant ce problème ( ici ):
HTML normalise automatiquement espaces dans les éléments, ignorant espaces de début / fin et conversion des espaces supplémentaires, des onglets et des nouvelles lignes dans un seul espace. Quand le sélénium lit le texte hors de la page, il tente de dupliquer ce comportement, de sorte que vous pouvez ignorer tous les onglets et les retours à la ligne votre HTML et faire des assertions basées sur à quoi ressemble le texte dans le navigateur quand rendu. Nous faisons cela en remplaçant tous les blancs non visibles (y compris le espace insécable "
& nbsp;
") avec un seul espace. Toutes les nouvelles lignes visibles (< br >
,< p >
et< pre >
formatés nouvelles lignes) doivent être conservées.Nous utilisons la même logique de normalisation sur le texte du test HTML Selenese les tables. Cela a un certain nombre de avantages D'abord, vous n'avez pas besoin de regardez la source HTML de la page comprendre ce que vos assertions devraient être; "
& amp; nbsp;
" les symboles sont invisibles à l'utilisateur final, et vous ne devriez donc pas avoir à se soucier d'eux lors de l'écriture Tests séléniens. (Vous n'avez pas besoin de mettre "& amp; nbsp;
" marqueurs dans votre cas de test assertText sur un champ qui contient "& nbsp;
".) Vous pouvez également mettre des nouvelles lignes et espaces dans votre sélénien balises< td >
; puisque nous utilisons le même logique de normalisation sur le cas de test comme nous le faisons sur le texte, nous pouvons nous assurer que les assertions et le texte extrait correspondra exactement.Cela crée un petit problème sur ces rares occasions où vous avez vraiment vouloir / besoin d'insérer des espaces supplémentaires dans votre cas de test. Par exemple, vous peut avoir besoin de taper du texte dans un champ comme ceci: "
toto
". Mais si vous simplement écrivez< td > foo < / td >
dans votre Cas de test Selenese, nous remplacerons votre espaces supplémentaires avec un seul espace.Ce problème a une solution de contournement simple. Nous avons défini une variable en sélénien,
$ {espace}
, dont la valeur est un simple espace. Vous pouvez utiliser$ {espace}
pour insérer un espace qui ne sera pas automatiquement coupé, comme ceci:< td & ft $ ff {espace} $ {espace} $ {espace} < / td >
. Nous avons également inclus une variable$ {nbsp}
, que vous pouvez utiliser pour insérer un espace insécable.Notez que les XPaths ne ne ne normalisent pas les espaces comme nous le faisons. Si tu as besoin écrire un XPath comme
// div [text () = "bonjour le monde"]
mais le HTML du lien est vraiment "hello & amp; nbsp; world
", vous devez insérez un véritable "& amp; nbsp;
" Dans votre Cas de test sélénien pour le faire correspondre, comme ça:// div [text () = "bonjour $ {nbsp} monde")
.
Autres conseils
J'ai trouvé que je pouvais faire la correspondance lorsque je saisissais un espace insécable codé en dur (U + 00A0) en tapant Alt + 0160 sous Windows entre les guillemets ...
//table[@id='TableID']//td[text()=' ']
a travaillé pour moi avec le personnage spécial.
D'après ce que j'ai compris, la norme XPath 1.0 ne gère pas les caractères Unicode protégés. Il semble y avoir des fonctions pour cela dans XPath 2.0 mais il semble que Firefox ne le supporte pas (ou j'ai mal compris quelque chose). Vous devez donc faire avec la page de codes locale. Moche, je sais.
En fait, il semble que la norme s’appuie sur le langage de programmation utilisant XPath pour fournir la séquence d’échappement Unicode correcte ... Donc, d’une certaine manière, j’ai fait ce qu’il fallait.
Essayez d'utiliser l'entité décimale & amp; # 160;
à la place de l'entité nommée. Si cela ne fonctionne pas, vous devriez pouvoir simplement utiliser le unicode. caractère pour un espace insécable au lieu de l'entité & amp; nbsp;
.
(Remarque: je n'ai pas essayé ceci dans XPather, mais je l'ai essayé dans Oxygen.)
N'oubliez pas qu'un processeur XML conforme aux normes aura remplacé toutes les références d'entités autres que les cinq références standard de XML ( & amp;
, & amp; gt;
, & amp; lt;
, & apos;
, & <; code>) avec le caractère correspondant dans l'encodage cible au moment où les expressions XPath sont évalué. Compte tenu de ce comportement, les suggestions de PhiLho et de jsulak sont la voie à suivre si vous souhaitez utiliser des outils XML. Lorsque vous saisissez
& amp; # 160;
dans l'expression XPath, celle-ci doit être convertie en séquence d'octets correspondante avant l'application de l'expression XPath.
Je ne peux pas obtenir de correspondance avec Xpather, mais les éléments suivants ont fonctionné pour moi avec des fichiers XML et XSL ordinaires dans le Bloc-notes XML de Microsoft:
<xsl:value-of select="count(//td[text()=' '])" />
La valeur renvoyée est 1, ce qui correspond à la valeur correcte dans mon cas de test.
Toutefois, j'ai dû déclarer nbsp en tant qu'entité au sein de mes fichiers XML et XSL à l'aide des éléments suivants:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
Je ne sais pas si cela vous aidera, mais j'ai pu trouver réellement trouver nbsp à l'aide d'une expression XPath.
Modifier: mon exemple de code contient les caractères '& amp; nbsp;' , mais la surbrillance de la syntaxe JavaScript le convertit en caractère d'espace. Ne soyez pas trompé!
Recherchez & amp; nbsp;
ou uniquement nbsp
- avez-vous essayé ceci?