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>&nbsp;</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; " ?

Était-ce utile?

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()='&nbsp;'])" />

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 "&#160;"> ]>

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top