XPath / Sélénium ne peut pas localiser un élément à l'aide d'une partielle avec l'identifiant contient / start-avec
J'ai le texte suivant du code HTML généré avec un AjaxFormLoop.
<div id="phones">
<div class="t-forminjector tapestry-forminjector" id="rowInjector_13b87fdd8b6">
<input id="number_13b87fdd8b6" name="number_13b87fdd8b7" type="text"/>
<a id="removerowlink_13b87fdd8b6" href="#" name="removerowlink_13b87fdd8b6">remove</a>
</div>
<div class="t-forminjector tapestry-forminjector" id="rowInjector_13b87fdda70" style="background-image: none; background-color: rgb(255, 255, 251);">
<input id="number_13b87fdda70" name="number_13b87fdda70" type="text" />
<a id="removerowlink_13b87fdda70" href="#" name="removerowlink_13b87fdda70">remove</a>
</div>
</div>
J'essaye d'accéder à la deuxième champ de saisie de l'enfant 2 à l'aide d'une partielle ID, cependant je n'ai pas réussi à obtenir que cela fonctionne.
Ce que j'ai essayé jusqu'à présent.
String path = "//input[contains(@id,'number_')][2]";
String path = "(//input[contains(@id,'number_')])[2]";
Je ne peux même pas accéder à l'entrée 1 à l'aide de 1 au lieu de 2, mais si je supprime [2] et de n'utiliser
String path = "//input[contains(@id,'number_')]";
Je suis en mesure d'accéder à la première place sans problème.
Si j'utilise exactement id, je suis en mesure d'accéder à l'un des champs sans problème.
J'ai besoin d'utiliser l'id si possible, car il y a beaucoup plus de champs dans chaque t-forminjector ligne qui ne sont pas présents dans cet exemple.
La mise en œuvre du Sélénium.
final String path = "(//input[starts-with(@id,'quantity_')])[2]";
new Wait() {
@Override
public boolean until() {
return isElementPresent(path);
}
}.wait("Element should be present", TIMEOUT);
Résolu
Je m'aperçois que je ne peux pas l'air d'utiliser le suivant commence-avec /contient de localiser n'importe quel élément dans les dom, en revanche si j'utilise une identification, il fonctionne.
//Partial ID - fails
//*[starts-with(@id,"quantity_")]
//Exact ID - works
//*[starts-with(@id,"quantity_-112409575185705")]
input
avec id="number_13b87fdda70"
Les odeurs d'un ne respectant pas/buggy XPath mise en œuvre. Votre deuxième expression XPath est correct. Une expression plus précise est:
(//input[starts-with(@id, 'number_')])[2]
Novatchev, j'ai changé mon xpath pour utilisation commence-avec, toujours sans succès. Je suis en utilisant ce avec le sélénium, donc je l'ai posté mon code ci-dessus. Je sais que les éléments font les dom faire pour le fait que je suis capable de les imprimer avec sélénium getHtmlSource méthode et de construire une liste de champ id de sélénium getAllFields() la méthode et ensuite y accéder avec xpath //input[@id='number_2308423']. Ce qui m'amène à croire que je suis soit à l'aide de xpath de manière incorrecte ou il y a un bug.
est droit. Utilisez quelque chose comme xpathtester.com pour exécuter un test rapide.
J'ai posté un exemple avec le code généré à partir de l'application. Peut-être que vous les gars seront en mesure d'aider à mon problème. xpathtester.com/saved/73f39fd7-f240-4e41-bd88-527cc8a8789a
OriginalL'auteur Code Junkie | 2012-12-11
Vous devez vous connecter pour publier un commentaire.
La sortie générée vous avez collé ici simplement ne contient pas la chaîne
number_
n'importe où. Il ne contenirNumber_
-- notez le capitalN
-- mais ce n'est pas la première partie de la chaîne. Peut-être que vous avez voulu dire quelque chose comme ceci (dont au moins sélectionne quelque chose):Ou:
J'ai couru contre le contenu que vous avez publié sur ce lien et il a très bien fonctionné.
Oui, je peux le faire fonctionner l'encontre de cette page de test trop, mais si j'essaie de le lancer dans le réel de l'application, le code exact, mais imbriquées dans le reste du formulaire, j'obtiens une erreur, un localisateur pas trouvé. Même erreur se produit dans l'IDE et firefox sélénium addon. Je suis en utilisant le sélénium 2.14.0, donc je ne suis pas sûr de ce que la verson de xpath est utilisé. Je suis en mesure de rechercher l'élément en utilisant "css=div#lineItem div.t-forminjector:nth-of-type(2) entrée.la quantité", mais pas la solution la plus élégante. Que pensez-vous pourrait se passer ici?
Pourrait être un espace de noms en question. Sont les espaces de noms définis plus haut dans le document?
OK, oui, ces éléments sont situés dans un espace de noms par défaut --
xmlns="http://www.w3.org/1999/xhtml"
-- ce qui signifie que vous devez l'associer cet espace de noms d'un arbitraire de préfixe et de qualifier tous les noms d'élément avec ce préfixe dans l'expression XPath. C'est la façon dont le processeur XPath sait que ceux qui sont vraiment les éléments que vous souhaitez. Le sélénium doit avoir une certaine façon de le faire, mais je n'ai pas utiliser le Sélénium, donc je ne peux pas être d'une grande aide.OriginalL'auteur Wayne Burkett
Comme Iwburk dit, c'était un espace de noms en question. Selon le Sélénium API,
http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/com/thoughtworks/selenium/Selenium.html
tout en utilisant une expression xpath, j'ai eu besoin d'utiliser xpath=xpathExpression mon changement de chaîne de requête:
J'ai trouvé un poste ici,
L'élément est trouvé dans XPath Checker mais pas en Sélénium
OriginalL'auteur Code Junkie
vous ne pouvez pas y accéder parce que vous n'êtes pas de la localisation de l'élément à être unique dans la page.
utiliser une expression xpath qui le rend unique ,
- vous êtes xpath regarder ok .
plus d'info ici
http://www.seleniumhq.org/docs/appendix_locating_techniques.jsp
OriginalL'auteur Ionut Emilian Moldovan
Outre le sélénium problème de syntaxe il y a un xpath question liée à la structure de majoration.
xpath 1:
//input[starts-with(@id,'number_')][1]
xpath 2:
(//input[starts-with(@id,'number_')])[1]
Dans l'exemple ci-dessous xpath 1 sera de retour 2 nœuds (incorrect) et xpath 2 sera la bonne parce que
input
les nœuds ne sont pas les frères et sœurs environnant les parenthèses sont nécessaires pour consulter l'ensemble de nœudsRésultat sans parenthèse
Dans cet exemple, les parenthèses ne va pas faire une différence parce que les noeuds sont des frères et sœurs
Avec la parenthèse
Sans parenthèse
Tests ont été effectués avec xmllint shell
xmllint --html --shell test.html
OriginalL'auteur Luis Muñoz