Erreur Xpath avec pas() et se termine avec()
J'ai l'expression Xpath suivante:
//*[not(input)][ends-with(@*, 'Copyright')]
Je l'attends pour me donner tous les éléments - à l'exception de l'entrée - avec toute valeur d'attribut qui se termine par "droit d'Auteur".
Je l'exécuter dans le Sélénium 2 API Java avec webDriver.findElements(By.xpath(expression))
et obtenez l'erreur suivante:
L'expression n'est pas un
expression
Mais ces expressions fonctionnent sans problème:
//*[not(input)][starts-with(@*, 'Copyright')]
//*[ends-with(@*, 'Copyright')]
Des idées?
Je ne sais pas Sélénium, mais si
Merci pour votre commentaire. Quelle est la différence entre
Merci beaucoup, je vais essayer cela. Vous pouvez créer une réponse afin que je puisse marquer comme la solution si cela fonctionne.
Bonne question, +1. Voir ma réponse pour l'analyse et l'explication des problèmes avec votre expression XPath. Suite à cela, un complet de XPath 1.0 et XPath 2.0 solutions sont présentées.
//*[not(input)][starts-with(@*, 'Copyright')]
est analysé avec succès et si en plus, le XPath 2.0 fonction ends-with
est pris en charge, alors je ne vois pas pourquoi //*[not(input)][ends-with(@*, 'Copyright')]
n'est pas accepté comme une expression juridique. Votre description verbale toutefois semble que si vous voulez //*[not(self::input)][@*[ends-with(., 'Copyright')]]
.Merci pour votre commentaire. Quelle est la différence entre
//*[not(self::input)][@*[ends-with(., 'Copyright')]]
et //*[not(input)][ends-with(@*, 'Copyright')]
?//*[not(input)]
permet de sélectionner tous les éléments n'ayant pas eu de input
élément enfant tout en //*[not(self::input)]
permet de sélectionner tous les éléments qui ne sont pas eux-mêmes input
éléments. Comme pour la comparaison de [@*[ends-with(., 'Copyright')]]
avec ce que vous avez, ma suggestion est vrai tant qu'il n'y a aucun nœud d'attribut qui se termine par le droit d'Auteur, tandis que votre test ne fonctionne que si il y a un attribut unique qui se termine par "droit d'Auteur", comme se termine-avec (w3.org/TR/xquery-operators/#func-ends-with) permettent une séquence avec un seul élément comme premier argument ou une séquence vide, mais pas plusieurs éléments.Merci beaucoup, je vais essayer cela. Vous pouvez créer une réponse afin que je puisse marquer comme la solution si cela fonctionne.
Bonne question, +1. Voir ma réponse pour l'analyse et l'explication des problèmes avec votre expression XPath. Suite à cela, un complet de XPath 1.0 et XPath 2.0 solutions sont présentées.
OriginalL'auteur Alp | 2011-05-29
Vous devez vous connecter pour publier un commentaire.
, Il existe quelques problèmes ici:
ends-with()
est une norme XPath 2.0 fonction seulement, alors les chances sont que vous êtes à l'aide d'un moteur XPath 1.0 et correctement génère une erreur car il ne sait pas sur une fonction appeléeends-with()
.Même si vous travaillez avec un XPath 2.0 processeur, l'expression
ends-with(@*, 'Copyright')
résultats dans l'erreur dans le cas général, parce que laends-with()
fonction est définie pour accepter atmost une seule chaîne (xs:string?
) car ses deux opérandes -- cependant@*
produit une séquence de plus d'une corde dans le cas où l'élément a plus d'un attribut.//*[not(input)]
ne veut pas dire "sélectionner tous les éléments qui ne sont pas nomméesinput
. Le vrai sens est: "Sélectionner tous les éléments qui n'ont pas un enfant de l'élément nommé "entrée".Solution:
Utiliser cette expression XPath 2.0:
//*[not(self::input)][@*[ends-with(.,'Copyright')]]
Dans le cas de XPath 1.0 utilisation de cette expression:
....
Ici est une courte et une vérification complète de la dernière expression XPath, à l'aide de XSLT:
lorsque cette transformation est appliquée sur le document XML suivant:
le voulait, résultat correct est produit:
Dans le cas du document XML d'être dans un espace de noms par défaut:
lorsqu'il est appliqué sur ce document XML:
le voulait, résultat correct est produit:
Malheureusement ne fonctionne pas trop: L'expression n'est pas une expression juridique: xpath=//*[not(self::input)][@*[substring(., string-length()-8) = "Copyright")]]
Semble que vous ne travaillez pas avec un compatible processeur XPath -- si oui, votre question sera mieux abordé d'une façon plus spécifique tag, pas dans le "xpath" de la balise, ce qui suppose que la question est un XPath question.
J'ai édité ma réponse et il comprend maintenant un complet XSLT-en fonction de vérification de la deuxième expression XPath. Vous pouvez simplement exécuter cette vérification, vous verrez que le résultat souhaité est produit.
Le sélénium utilise le navigateur du moteur XPath est donc susceptible d'une mise en œuvre complète. J'ai eu des problèmes avec des cadres ou des fenêtres multiples, de Sélénium et de se concentrer pour des requêtes Xpath. Êtes-vous à l'aide de ces fonctionnalités?
OriginalL'auteur Dimitre Novatchev
Je ne sais pas Sélénium, mais si
//*[not(input)][starts-with(@*, 'Copyright')]
est analysé avec succès et si en plus, le XPath 2.0 fonctionends-with
est pris en charge, alors je ne vois pas pourquoi//*[not(input)][ends-with(@*, 'Copyright')]
n'est pas accepté comme une expression juridique. Votre description verbale toutefois semble que si vous voulez//*[not(self::input)][@*[ends-with(., 'Copyright')]]
.//*[not(input)]
permet de sélectionner tous les éléments n'ayant aucune entrée de l'élément enfant tout en//*[not(self::input)]
permet de sélectionner tous les éléments qui ne sont pas eux-mêmesinput
éléments. Comme pour la comparaison de[@*[ends-with(., 'Copyright')]]
avec ce que vous avez, ma suggestion est vrai tant qu'il n'y a aucun nœud d'attribut qui se termine par le droit d'Auteur, tandis que votre test ne fonctionne que si il y a un attribut unique qui se termine par "droit d'Auteur", comme se termine-avec http://www.w3.org/TR/xquery-operators/#func-ends-with permettre une séquence avec un seul élément comme premier argument ou une séquence vide, mais pas plusieurs éléments.//*[not(self::input)][@*[ends-with(., 'Copyright')]]
.Êtes-vous sûr que le Sélénium prend en charge un XPath 2.0 fonction comme
ends-with
?Oui, car, sans aucune condition, il fonctionne bien.
Autant je comprends les expressions XPath sont beaux. Cependant, je ne sais pas Sélénium, donc je ne sais pas pourquoi il se plaint et ne peut pas vous aider. J'espère que quelqu'un d'autre arrive et peut vous dire ce qui est faux.
En tout cas merci pour votre aide. Je pense que je dois te le demandons au Sélénium groupe d'utilisateurs.
OriginalL'auteur Martin Honnen
La plupart explication la plus probable est que vous êtes à l'aide de XPath 1.0 processeurs. Les extrémités-() la fonction exige de XPath 2.0.
Oui,
starts-with
est également à partir de XPath 2.0Non, commence-avec ce qui était disponible dans la version 1.0. se termine-avec est nouveau dans la version 2.0.
OriginalL'auteur Michael Kay
Peut être petite correction avec
string-length(.)
Maintenant, il peut fonctionner.
OriginalL'auteur Vamsi