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.
4 Réponses :
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]
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.
Cela n'obtiendrait que la deuxième correspondance:
input = driver.find_element_by_xpath("//label[contains(text(),'City')][2]/input")
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)
À 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.
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 doncinput = driver.find_element_by_xpath (("// label [contains (text (), 'City')] // following :: inpu t) [2]") code >