0
votes

selenium.common.Exception.noschelementException: Message: Impossible de localiser l'élément: [ID = "Login-passwd"]

Je travaille sur un programme Python qui fonctionnera par le terminal Ubuntu. Après avoir appelé le programme, il supposait ouvrir Firefox et se connecter à mon email et remplir automatiquement le nom d'utilisateur, puis passer à la page suivante, puis remplir le mot de passe, puis vous connecter et envoyer envoyer un email. Lorsque j'exécute le programme de la ligne de commande Python Oolle One One à la fois, cela fonctionne. Mais lorsque je l'exécute bien que le terminal est donc exécutant tout le programme, il s'arrête avant de remplir le mot de passe. Cette ligne est exécutée xxx pré>

puis il ne remplit pas le mot de passe comme il est supposé. P> xxx pré>

C'est mon code complet:

Traceback (most recent call last):
  File "./commandLineEmailer.py", line 18, in <module>
    passElem = browser.find_element_by_id('login-passwd')
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 360, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="login-passwd"]


1 commentaires

Utiliser le sélénium attend


3 Réponses :


1
votes

Il n'y a pas d'attente là-bas. Chaque fois que vous soumettez quelque chose, et une page doit être chargée, vous devez avoir une sorte d'attente. Il essaie littéralement de trouver l'élément de mot de passe pendant que l'ancien nom d'utilisateur et soumettre le bouton est toujours probablement rendu sur le DOM. Certainement avant que le champ de mot de passe ait rendu.

C'est pourquoi l'exécution d'une commande à la fois fonctionne. La page a le temps de charger lorsque vous entrez manuellement le code.

Voici une question récente avec plusieurs exemples concernant les attentes dans le sélénium. Il suffit de le convertir en Python. C'est la même logique, si la syntaxe différente.

Vérifiez si un bouton est disponible? Si ne pas attendre 5 secondes et vérifier à nouveau?


0 commentaires

1
votes

comme @Asyranok mentionné Vous devez attendre que l'élément soit apparu:

from selenium import webdriver
import selenium.webdriver.support.ui as ui

driver = webdriver.Firefox()
wait = ui.WebDriverWait(driver, 10)
driver.get('https://mail.yahoo.com')
login = driver.find_element_by_id('login-username')
login.clear()
login.send_keys('johndoe')
login.submit()
wait.until(lambda driver: driver.find_element_by_id('login-passwd'))
pwd = driver.find_element_by_id('login-passwd')
pwd.send_keys('12345')


0 commentaires

0
votes

sélénium est plus rapide que la page Web. Il essaie donc de trouver l'élément (champ de texte de mot de passe) avant qu'il soit chargé. Donc, le code est un élément de lancement non trouvé. Vous pouvez utiliser thread.sleep (2000) ou attendre externe.


0 commentaires