0
votes

Xpath pour sélectionner la deuxième correspondance de texte au lieu de la première et sélectionner l'élément suivant

J'essaie de sélectionner un élément qui a une classe générée aléatoirement donc ma seule façon de sélectionner cet élément est d'utiliser xpath .

L'élément que je dois sélectionner est une entrée avec le libellé précédent "Ville" mais le problème est qu'il apparaît trois fois sur le site et je souhaite sélectionner la deuxième correspondance sur le site.

J'ai essayé ceci, mais il sélectionne uniquement le premier.

input = driver.find_element_by_xpath("//label[contains(text(),'City')]//following::input")[1]

Pour sélectionner le second, j'ai essayé mais cela ne fonctionne pas.

input = driver.find_element_by_xpath("//label[contains(text(),'City')]//following::input")

Toute aide serait grandement appréciée.


2 commentaires

Pouvez-vous également ajouter la source html de l'élément?


Je vois une faute de frappe dans le cpath, essayez cela peut être (// label [contains (text (), 'City')] // following :: input) [2] . La ligne complète sera donc input = driver.find_element_by_xpath (("// label [contains (text (), 'City‌')] // following :: inpu‌ t) [2]")


4 Réponses :


0
votes

Il vous manque un "s" dans find_element_by_xpath . Essayez find_elements_by_xpath.

input_all = driver.find_elements_by_xpath("//label[contains(text(),'City')]//following::input")
print("len(input_all):", len(input_all))

Vous pouvez vous assurer qu'il y a 3 instances attendues qui correspondent à cet xpath avec quelque chose comme:

input = driver.find_elements_by_xpath("//label[contains(text(),'City')]//following::input")[1]


5 commentaires

Ne demande-t-il pas de localiser un élément? pourquoi find_elements_by_xpath dans ce cas?


@Dhamo selon ce qui est indiqué ci-dessus, 3 éléments correspondent au xpath donné ci-dessus, mais lorsqu'il a essayé de trouver le second, il a échoué. Tenter de localiser le deuxième élément avec find_element_by_xpath ....) [1] échouera. Donc, sans accès au html, j'ai suggéré d'utiliser find_elements_by_xpath .


Eh bien, plus qu'une réponse, celle-ci semble être un moyen de s'assurer que le xpath donné est correct pour correspondre aux 3 éléments.


@Dhamo si l'hypothèse que xpath correspond exactement à trois éléments est correcte, la première partie de ma réponse fonctionnera. Si cette hypothèse est fausse, la deuxième partie de ma réponse peut être utilisée pour trouver l'index souhaité.


Oui, acceptez que find_elements_by_xpath localisera le premier élément correspondant (City1) même s'il a plus de correspondances (City2, City3). La solution recommandée est toujours de localiser le bon élément pour éviter d'autres retouches (par exemple, si la ville 0 est ajoutée). Mais vous avez raison, sans le html, nous ne pouvons proposer que de telles solutions.



0
votes

Cela n'obtiendrait que la deuxième correspondance:

input = driver.find_element_by_xpath("//label[contains(text(),'City')][2]/input")


0 commentaires

0
votes

si vous cherchez à obtenir un deuxième élément correspondant, vous pouvez essayer

WebElement input = driver.findElements (By.xpath ("// label [contains (text (), 'City')] // following :: input")). get (1)


0 commentaires

0
votes

À proprement parler, le XPath suivant répond à vos besoins:

(//input[preceding::label[1][contains(.,"City")]])[2]

Sélectionnez le 2ème élément input de la page qui respecte la condition suivante: est précédé d'un label élément contenant un texte spécifique.


0 commentaires