Je doute d'avoir été clair sur la question, mais je souhaite recevoir le dernier message envoyé par une personne sur Discord (via le Web). Le problème est que, lors de l'utilisation de l'inspecteur Web pour essayer d'obtenir un attribut unique du message, j'ai remarqué que tous les autres messages ont la même classe et qu'il n'y a pas d'autre attribut (comme la classe, l'id, etc.) que je peux utiliser . Je suis nouveau sur Selenium et HTML, donc je ne sais pas grand-chose.
Disons que j'ai 2 messages. Le premier dit "bonjour" et le second "au revoir". Quand je tape ceci:
message = self.driver.find_element_by_xpath("//div[contains(concat(' ', normalize-space(@class), ' '), ' markup-2BOw-j containerCozy-336-Cz markupRtl-3M0hmN ')]")
J'obtiens "bonjour", car les deux messages partagent la même classe markup-2BOw-j containerCozy-336-Cz markupRtl-3M0hmN , et apparemment la méthode choisit la première qui correspond.
J'ai parcouru d'autres questions similaires, mais le message est inconnu donc je ne peux pas utiliser contains , ni [position () = 2] à la fin de la méthode find_element_by_xpath car je ne connais pas le numéro du message.
Est y a-t-il un moyen de faire ça?
3 Réponses :
Vous pouvez utiliser find_elements_by_xpath pour obtenir une liste de tous les éléments correspondant au localisateur et prendre le dernier élément de cette liste
find_elements_by_css_selector('.markup-2BOw-j.containerCozy-336-Cz.markupRtl-3M0hmN')
En passant, vous pouvez simplifier le xpath à
find_elements_by_xpath("//div[@class='markup-2BOw-j containerCozy-336-Cz markupRtl-3M0hmN']")
Ou utilisez plutôt css_selector
all_messages = self.driver.find_elements_by_xpath("//div[contains(concat(' ', normalize-space(@class), ' '), ' markup-2BOw-j containerCozy-336-Cz markupRtl-3M0hmN ')]")
message = all_messages[-1]
p>
Merci beaucoup!!! Mais pourquoi le all_messages [-1] ? Que fait le [-1] pour obtenir le dernier élément?
@Gintade [-1] prend le dernier élément d'une liste en Python.
Pour ce faire, utilisez find_elements_by_xpath . Il renverra une liste des WebElements correspondants. Après cela, vous pouvez accéder au dernier élément en utilisant la liste [-1]
message = self.driver.find_elements_by_xpath("//div[@class='markup-2BOw-j containerCozy-336-Cz markupRtl-3M0hmN']")
print(message[-1].text)
En quoi cette réponse est-elle différente de la mienne?
@Guy ma première réponse ici.Il n'y avait pas de réponses ici pendant que j'écrivais ceci.
Utilisez last():
message = self.driver.find_element_by_xpath("(//div[contains(concat(' ', normalize-space(@class), ' '), ' markup-2BOw-j containerCozy-336-Cz markupRtl-3M0hmN ')])[last()]")
Est-ce que tous les messages
divpartagent le textemarkup-2BOw-j containerCozy-336-Cz markupRtl-3M0hmNdans@class?Oui, ils partagent tous le texte @ AshmitBhattarai
Avez-vous utilisé
find_elements_by_xpathà la place?message = self.driver.find_elements_by_xpath ("// div [contient (concat ('', normalize-space (@class), ''), 'markup-2BOw-j containerCozy-336-Cz markupRtl-3M0hmN' )] ")