127 votes

Utilisation de XPATH pour rechercher du texte contenant &nbsp ;

J'utilise Navigateur XPather pour vérifier mes expressions XPATH sur une page HTML.

Mon objectif final est d'utiliser ces expressions dans Selenium pour le test de mes interfaces utilisateur.

J'ai obtenu un fichier HTML avec un contenu similaire à celui-ci :

<tr>
  <td>abc</td>
  <td>&nbsp;</td>
</tr>

Je veux sélectionner un nœud dont le texte contient la chaîne " &nbsp; ".

Avec une chaîne normale comme "abc", il n'y a pas de problème. J'utilise un XPATH similaire à //td[text()="abc"] .

Lorsque j'essaie avec un XPATH comme //td[text()="&nbsp;"] il ne renvoie rien. Existe-t-il une règle spéciale concernant les textes avec " & " ?

0 votes

Votre transformation XSL actuelle ne renvoie rien ? Ou seulement Xpather ?

95voto

Bergeroy Points 943

Il semble que OpenQA Les responsables de Selenium ont déjà abordé ce problème. Ils ont défini des variables pour faire correspondre explicitement les espaces. Dans mon cas, j'ai besoin d'utiliser un XPATH similaire à //td[text()="${nbsp}"] .

J'ai reproduit ici le texte de l'OpenQA concernant cette question (trouvé ici ):

Le HTML se normalise automatiquement l'espace blanc dans les éléments, en ignorant les espaces avant/arrière et en convertissant les espaces supplémentaires, les tabulations et les nouvelles lignes en un en un seul espace. Lorsque Selenium lit le texte [ ] de dupliquer ce comportement, de sorte que vous pouvez ignorer toutes les tabulations et les sauts de ligne dans votre HTML et faire des assertions basées sur comment le texte apparaît dans le navigateur lorsqu'il est rendu. Nous faisons cela en remplaçant tous les espaces blancs non visibles (y compris les espace insécable " &nbsp; ") avec un espace unique. Tous les retours à la ligne visibles ( <br> , <p> y <pre> formaté nouvelles lignes) doivent être préservées.

Nous utilisons la même normalisation le texte des tables de cas de test HTML Selenese tables. Cela présente un certain nombre avantages. Premièrement, vous n'avez pas besoin de regarder la source HTML de la page pour pour savoir ce que vos assertions doivent être ; " &nbsp; "sont invisibles l'utilisateur final, et vous ne devriez donc pas vous s'en préoccuper lors de l'écriture de tests en sélénien. (Vous n'avez pas besoin de mettre " &nbsp; marqueurs " dans votre scénario de test pour assertText sur un champ qui contient des " &nbsp; ".) Vous pouvez également ajouter des [ ] <td> balises ; puisque nous utilisons la même logique de normalisation sur le scénario de test que nous le faisons sur le texte, nous pouvons garantir que les assertions et le texte extrait correspondront exactement.

Cela crée un petit problème sur t voulez/devez insérer des espaces supplémentaires dans votre scénario de test. Par exemple, vous pouvez avoir besoin de taper du texte dans un champ comme ceci : " foo ". Mais si vous vous contentez de écrire <td>foo </td> dans votre cas de test Selenese, nous remplacerons vos espaces supplémentaires par un seul espace.

Il existe une solution simple à ce problème. Nous avons défini une var ${space} , espace. Vous pouvez utiliser ${space} à insérer un espace qui ne sera pas [ ] <td>foo${space}${space}${space}</td> . W ${nbsp} , un espace insécable.

Notez que les XPaths ne no normaliser les espaces blancs de la manière dont nous le faisons. Si vous avez besoin [ ] //div[text()="hello world"] mais le HTML du lien est vraiment " hello&nbsp;world ", vous devrez insérer un vrai " &nbsp; "dans votre cas de test Selenese pour qu'il corresponde, [ ] //div[text()="hello${nbsp}world"] .

1 votes

Le lien OpenQA ne se charge plus correctement

7 votes

Je veux juste noter que ${nbsp} ne fonctionne pas pour moi dans Selenium ou dans les outils de développement de Chrome, pas plus que \u00a0 . Ce qui a fonctionné pour moi, c'est de taper un espace insécable, sur mac. Alt+Shift+Space . La recherche sur Internet dit Alt+0160 sur Windows.

33voto

PhiLho Points 23458

J'ai découvert que je peux faire la correspondance lorsque je saisis une espace insécable codée en dur (U+00A0) en tapant Alt+0160 sous Windows entre les deux guillemets...

//table[@id='TableID']//td[text()=' ']

ça a marché pour moi avec la carte spéciale.

D'après ce que j'ai compris, la norme XPath 1.0 ne gère pas l'échappement des caractères Unicode. 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 vous contenter du codepage local. C'est 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 la bonne chose.

1 votes

En utilisant Xpather 1.4.1 dans Firefox 2, //td[text()=' '] ne donne aucun résultat.

0 votes

Désolé. Ça ne marche pas pour moi. Mon objectif final est de l'utiliser dans Selenium pour les tests de mes interfaces Web. Selenium lui-même conserve les expressions de test dans une structure XML et la saisie Alt Windows semble se perdre en chemin. De plus, mes retours sont en XML.

1 votes

Zack, comme je l'ai écrit, il faut remplacer l'espace entre les deux guillemets par le caractère produit par Alt+0160 (sur le clavier numérique).

5voto

James Sulak Points 9959

Essayez d'utiliser l'entité décimale &#160; au lieu de l'entité nommée. Si cela ne fonctionne pas, vous devriez être en mesure d'utiliser simplement l'attribut caractère unicode pour un espace insécable au lieu de la &nbsp; entité.

(Note : je n'ai pas essayé ceci dans XPather, mais je l'ai essayé dans Oxygen).

1voto

ChuckB Points 670

N'oubliez pas qu'un processeur XML conforme aux normes aura remplacé toute référence d'entité autre que les cinq références standard de XML ( &amp; , &gt; , &lt; , &apos; , &quot; ) avec le caractère correspondant dans l'encodage cible au moment où les expressions XPath sont évaluées. Étant donné ce comportement, les suggestions de PhiLho et de jsulak sont la voie à suivre si vous voulez travailler avec des outils XML. Lorsque vous entrez &#160; dans l'expression XPath, il doit être converti en la séquence d'octets correspondante avant l'application de l'expression XPath.

1 votes

Pas si vous essayez/utiliser XPath dans XPather (GUI) ou en JavaScript (pas d'auto-substitution d'entités, puisque nous ne sommes pas en XML). Bon conseil dans d'autres environnements XML (XSTL ?).

0voto

Zack The Human Points 5517

Je ne peux pas obtenir de correspondance en utilisant Xpather, mais ce qui suit a fonctionné pour moi avec des fichiers XML et XSL simples dans le bloc-notes XML de Microsoft :

<xsl:value-of select="count(//td[text()='&nbsp;'])" />

La valeur renvoyée est 1, ce qui est la valeur correcte dans mon cas d'essai.

Cependant, j'ai dû déclarer nbsp comme une entité dans mon XML et XSL en utilisant ce qui suit :

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

Je ne suis pas sûr que ça vous aide, mais j'ai pu en fait trouver nbsp en utilisant une expression XPath.

Edit : Mon exemple de code contient en fait les caractères ' ' mais la coloration syntaxique de JavaScript le convertit en caractère espace. Ne vous laissez pas tromper !

0 votes

Vous pouvez modifier votre exemple de code comme cela a été fait pour l'exemple dans ma question. Remplacez votre entité nbsp par &nbsp ;.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X