1
votes

Impossible de localiser l'élément - plusieurs éléments semblent avoir des informations similaires et minimales et je ne peux pas trouver l'un ou l'autre correctement

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>


4 commentaires

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.


5 Réponses :


0
votes

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.


2 commentaires

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?



0
votes

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"))
    


0 commentaires

0
votes

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.


1 commentaires

Je ne peux pas avoir peur du site interne de l'entreprise



0
votes

L'expression XPath appropriée serait quelque chose comme:

//label[text()='Device Status:']/ancestor::tr/descendant::*[contains(@class,'EndLine')]

où:

Demo:

 entrez la description de l'image ici


0 commentaires

0
votes

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")


0 commentaires