J'essaie d'extraire certains attributs d'un élément sur un site Web, mais je reçois une erreur d'élément Impossible de trouver. L'élément ne contient pas beaucoup d'informations à rechercher, à part les attributs, et celui que je veux changer à chaque fois.
Au départ, je convertissais le HTML en texte, puis je cherchais regex dans le texte pour obtenir ce que vouloir. J'essaye maintenant de le rendre un peu plus élégant.
J'ai essayé:
browser.find_element_by_name("Status")
pour rechercher l'attribut de texte (je sais que c'est faux)
browser.find_element_by_xpath("//label[@class='copySource' ")
et un tas d'autres variantes
browser.find_element_by_xpath ("// element [@ attribute = 'Device Status:']")
plus quelques autres trucs.
l'utilisation de ceci, avec find all elements
, a renvoyé une liste vide sans erreur.
browser.find_elements_by_xpath("//span[@class='class'letter")
Le code que j'essaie de rechercher: p >
NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//element[@attribute='Device Status:']"}
J'essaye d'extraire l'attribut dans le dernier élément, le mot "opérationnel" (ce mot change). Obtenir une erreur (ou quelque chose de similaire à):
<td> <label class="copySource">Device Registration Status:</label> </td> <tr> <td> <label class="copySource">Device Status:</label> </td> <td> <span class="copySource copyEndLine">operational</span> </td> </tr>
5 Réponses :
Essayez avec
browser.find_element_by_css_selector(".copyEndLine").text
Vous pouvez essayer d'ajouter une condition d'attente avant d'obtenir le texte de l'élément, quelque chose comme "attendez que l'élément soit présent" car il n'est peut-être pas encore chargé lorsque vous l'êtes interagir avec.
na pas de chance. élément essayé et obtenir le même, "aucun élément de ce type: impossible de localiser l'élément: {" method ":" css selector "," selector ":". copyEndLine "}" Changez-le en éléments et obtenez une liste vide [] Et essayé prolonger immédiatement le temps d'attente et toujours pas de chance
Le code HTML que vous avez posté à l'intérieur d'une iframe est-il par hasard?
Pour extraire le texte opérationnel , vous devez induire WebDriverWait pour le visibilité_of_element_located ()
et vous pouvez utiliser l'un des éléments suivants Stratégies de localisation :
cssSelector
:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
xpath
:
print(WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.XPATH, "//label[@class='copySource' and text()='Device Status:']//following::td[1]/span[@class='copySource copyEndLine']"))).get_attribute("innerHTML"))
Remarque : vous devez ajouter les importations suivantes:
print(WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "tr td>span.copySource copyEndLine"))).get_attribute("innerHTML"))
Cela se produit généralement lorsqu'il y a des composants avec des noms / balises similaires.
Pouvez-vous essayer: browser.find_elements_by_xpath ("// span [@ class = 'class']") [0]
ou tout autre index; basé sur le nombre de composants similaires sur la page.
De plus, si vous pouviez partager l'URL de la page que vous essayez, ce serait utile.
Je ne peux pas avoir peur du site interne de l'entreprise
L'expression XPath appropriée serait quelque chose comme:
//label[text()='Device Status:']/ancestor::tr/descendant::*[contains(@class,'EndLine')]
où:
ancestor :: tr
- sélectionne le tableau approprié tr tag qui est ancêtre de la version actuelle élément descendant :: * [contains (@ class, 'EndLine')]
- recherche un descendant (enfant ou petit-enfant) qui L'attribut class
contient EndLine
via XPath contient () fonction Demo:
Vous pouvez essayer ceci:
driver.switchTo().frame("FrameName");
Si l'élément est à l'intérieur d'un cadre, vous devez passer au cadre, vous pouvez utiliser ceci:
browser.find_elements_by_cssselector(".copySource.copyEndLine")
Vérifiez si la table est là dans Iframe. Habituellement, il devrait fonctionner avec le localisateur css
td span.copyEndLine
si l'élément est là dans la fenêtre principale.Pas d'iframes là-bas
Trouvé les problèmes - nécessaire pour explorer pour spécifier un xpath plus précis. Cela a-t-il acheté en copiant xpath à partir de chrome, puis en le collant ailleurs. Je suis une annonce assez récente ne savais pas que je pouvais le faire. Résolu! Merci pour votre aide tout le monde
Heureux que vous soyez en mesure de le faire. Vérifiez ma réponse sur comment utiliser xpath . Cela pourrait vous donner quelques conseils et vous aider pour commencer.