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")]
Votre 2ème XPath semble correct. Il sélectionne 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