xpath pour localiser li avec du texte ne fonctionne pas
À l'aide de xpath //ul//li[contains(text(),"outer")]
de trouver un li dans le bord extérieur ul ne fonctionne pas
<ul>
<li>
<span> not unique text, </span>
<span> not unique text, </span>
outer ul li 1
<ul >
<li> inner ul li 1 </li>
<li> inner ul li 2 </li>
</ul>
</li>
<li>
<span> not unique text, </span>
<span> not unique text, </span>
outer ul li 2
<ul >
<li> inner ul li 1 </li>
<li> inner ul li 2 </li>
</ul>
</li>
</ul>
Aucune idée de comment trouver un li avec un texte spécifique à l'extérieur de l'ul?
Merci
Le membre de phrase "ne pas travailler" devrait être un indice que vous devez spécifier au moins (a) à quoi vous vous attendiez, et (b) ce qui s'est réellement passé.
Je pense que la question est claire pour ceux qui ont des connaissances sur Selenium ide. Et tous les deux (a) et (b) que vous avez mentionnés sont dans la question. Merci d'avoir pris le temps de commenter.
Pour (a), il y a "pour y trouver un li dans le bord extérieur de l'ul", ce qui est source de confusion car il est en conflit avec l'intention apparente de la XPath, qui est de trouver un
Je pense que la question est claire pour ceux qui ont des connaissances sur Selenium ide. Et tous les deux (a) et (b) que vous avez mentionnés sont dans la question. Merci d'avoir pris le temps de commenter.
Pour (a), il y a "pour y trouver un li dans le bord extérieur de l'ul", ce qui est source de confusion car il est en conflit avec l'intention apparente de la XPath, qui est de trouver un
<li>
n'importe où qui contient le texte "extérieure". En précisant exactement les nœuds que vous attendez le chemin XPath de retour serait de clarifier la confusion au sujet de votre intention. Je ne vois pas (b) tout spécifiée. Peut-être que votre XPath renvoie trop <li>
s, ou peut-être rien, ou peut-être le mal?OriginalL'auteur mnish | 2013-07-01
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne pour vous
//ul//li[contains(.,"outer")]
merci beaucoup!
Ce serait de sélectionner et de tester texte dans n'importe quel descendant de la li de li dans un niveau plus profond ou de durée).
Vous êtes les bienvenus. Je suis heureux de vous aider.
OriginalL'auteur Ievgen
L'exécution de ce avec Saxon, l'origine de l'expression XPath donne:
XPTY0004: UNE séquence de plus d'un élément n'est pas permis car le premier argument de
contient() ("", "", ...)
Maintenant, je suppose que le Sélénium est probablement à l'aide de XPath 1.0 plutôt que de XPath 2.0 et 1.0 de la fonction contains() a "premier élément sémantique" - il convertit son argument une chaîne de caractères, qui, si l'argument est un node-set contenant plus d'un nœud, implique de prendre en compte seulement le premier nœud. Et le premier nœud de texte est probablement espaces.
Si vous voulez tester si un enfant nœud de texte contient "extérieure", l'utilisation
Une autre raison pour la commutation de XPath 2.0...
OriginalL'auteur Michael Kay
Je m'attends à ce que vous n'aimez que de considérer les nœuds de texte qui sont les enfants directs de la
li
. Donc, vous avez raison avec l'aide detext()
(si vous utilisezcontains(.,"outer")
cela permettra d'envisager la forme d'un texte tous les enfants de li).Donc essayez ceci:
Bonne question ;-). J'ai pensé à l'origine de xpath devrait le faire. Mais je lui ai donné un essai avec xsltproc, et il n' pas. L'un au-dessus de n'. Mais je dois avouer que je n'ai pas d'explication pourquoi l'original n'a pas.
Voir ma réponse pour une explication de pourquoi le premier échoue.
Ok merci! Je viens de lire xpath string: "Un node-set est converti en une chaîne de caractères par le retour de la chaîne de valeur du nœud dans le node-set est le premier dans l'ordre du document. Si le node-set est vide, une chaîne vide est retournée."
OriginalL'auteur hr_117
Pour le problème ci-dessus, -
Cette solution
//ul//li[contains(.,"externe")]
"." Sélectionne le nœud actuel
OriginalL'auteur Aashi