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 puis il ne remplit pas le mot de passe comme il est supposé. P> 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"]
3 Réponses :
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. p>
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. P>
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. P>
Vérifiez si un bouton est disponible? Si ne pas attendre 5 secondes et vérifier à nouveau? p>
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')
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) code>
ou attendre externe. p>
Utiliser le sélénium attend