Sélénium: Comment faire pour exécuter une fonction Xpath ou de l'expression de mon test?
Est-il possible d'exécuter un code Xpath en Sélénium de test? Je sais que vous pouvez exécuter le code javascript, mais je suis à la recherche d'un moyen d'exécuter un code Xpath-delà de la simple localisation d'un élément sur la page.
Quelqu'un courir dans tout cela?
OriginalL'auteur Andrew | 2009-02-16
Vous devez vous connecter pour publier un commentaire.
Je crois que l'on a accepté la réponse est incorrecte. Je suis actuellement en apprentissage Selenium WebDriver avec Java et j'ai été dirigé vers le blog suivant pour savoir comment exécuter des fonctions XPath en Sélénium 2 pour la gestion variable des requêtes xpath. Je crois que c'est ce que vous cherchez.
http://automationtricks.blogspot.com/2010/09/how-to-use-functions-in-xpath-in.html
Est-il possible de modifier votre Réponse?
il ya go. profitez de
génial....merci
OriginalL'auteur Tim Boland
C'est ma compréhension que les fonctions XPath sont une partie de XPath 2.0. Le sélénium ne prend pas en charge 2.0. Ainsi, l'exécution de fonctions XPath dans le sélénium n'est pas possible.
OriginalL'auteur Andrew
Andrew,
Question intéressante. Vous pourriez vouloir essayer le Sélénium forum des Développeurs ou à l'Utilisation Avancée du Forum, depuis que je suis probablement la seule Sélénium Développeur qui traîne sur StackOverflow maintenant 🙂
Cela dit, je suis positif, vous pouvez le faire, mais je ne peux pas vous obtenir le code en ce moment (sur un portable qui n'a pas le Sélénium source). Il faudra obtenir un handle vers le navigateur "bot" (voir les exemples de l'exécution arbitraire de code JS pour savoir comment faire). À partir de là, il peut y avoir un appel de fonction (ou susceptibles de la chaîne d'appels) qui peut vous obtenir ce que vous voulez: un appel à l'Sélénium XPath l'abstraction.
Ou, si vous êtes OK avec seulement l'appui Firefox, il suffit de regarder le code JS pour faire Firefox requêtes XPath et l'appeler. Il est assez facile de les intégrer dans un storeEval-type de commande. Sinon, n'oubliez pas que le Sélénium injecte un XPath de la bibliothèque à côté de Sélénium bibliothèque JS. Vous pourriez l'appeler directement. Vous ne seriez pas obtenir les raccourcis et les abstractions que le Sélénium fournit pour certains de simples expressions XPath, mais je suis sûr qu'il avait un travail.
Pouvez-vous partager ce que vous essayez de faire? Généralement ce genre de choses de moi quand je suis en essayant d'obtenir un attribut ou valeur de texte d'un élément.
OriginalL'auteur Patrick Lightbody
Selon le W3C XPath 1.0 spec, il est des fonctions de support de XPath 1.0, mais à un ensemble limité de fonctions disponibles: http://www.w3.org/TR/xpath#section-String-Functions
En particulier la "fin" de la fonction n'est pas disponible - je utiliser des expressions comme
//input[substring(@id, string-length(@id) - string-length('<idSuffix>') +1) = '<idSuffix>']
comme une solution de contournement (dans ce cas de trouver un élément d'entrée qui a un id de fin
'<idSuffix>'
).OriginalL'auteur
Prendre un coup d'oeil à la ligne 1177 de l'htmlutils.js fichier dans la version 1.0.1 de Sélénium (ceci dans l'intérieur de la eval_xpath() la fonction qui s'occupe de toutes les requêtes XPath):
Le problème ici est que, selon le XPathResult spécification, iterateNext() lève une exception si le type de résultat n'est pas un objet iterable ensemble de nœuds. Depuis le Sélénium aveuglément suppose que toutes les requêtes XPath résultat dans un ensemble de nœuds, vous ne pouvez pas exécuter une requête qui renvoie un nombre ou une chaîne.
Ce que vous pouvez faire est de modifier htmlutils.js par substitution, aux lignes 1177-1181 avec quelque chose comme ce qui suit:
L'idée est que si nous voyons un certain nombre de valeur que nous envelopper à l'intérieur d'un DOM TextNode et de la transmettre comme d'habitude, un changement qui est plus ou moins transparente autant que le Sélénium est concerné. Le sélénium getText de commande a une manipulation spéciale pour TextNodes (il retourne le texte de leur contenu comme une Chaîne de caractères) alors maintenant, vous pouvez faire quelque chose comme
où sélénium est une instance de DefaultSelenium si vous êtes à l'aide de la SeleniumRC client Java comme je suis. Bien sûr c'est un exemple trivial, car vous pourriez juste getXpathCount() et il y a d'autres XPathResult types de poignée, mais cela devrait vous aider à démarrer sur la voie de droite.
Notez également que les lignes mentionnées ci-dessus sont uniquement pour le navigateur natif d'exécution de requêtes XPath. L'exécution à l'aide de Sélénium intégré dans XPath bibliothèque est traitée immédiatement après, à l'intérieur de eval_xpath() et nécessiterait probablement des modifications similaires - mais je n'ai pas regardé encore.
OriginalL'auteur