2016-04-02 3 views
1

Я пытаюсь автоматизировать вход в GMail с использованием пакета Selenium Python. Тем не менее, я не в состоянии выполнить задачу и получить следующую ошибку:Автоматизация входа в систему GMAIL с использованием Python-Selenium

Traceback (most recent call last): 
    File "C:\Users\Surojit\Desktop\Python\automaticpasswordFiller.py", line 21, in <module> 
    passwordElem = browser.find_element_by_id('Passwd') 
    File "C:\Users\Surojit\AppData\Local\Programs\Python\Python35-32\lib\site- packages\selenium\webdriver\remote\webdriver.py", line 266, in find_element_by_id 
    return self.find_element(by=By.ID, value=id_) 
    File "C:\Users\Surojit\AppData\Local\Programs\Python\Python35-32\lib\site- packages\selenium\webdriver\remote\webdriver.py", line 744, in find_element 
    {'using': by, 'value': value})['value'] 
    File "C:\Users\Surojit\AppData\Local\Programs\Python\Python35-32\lib\site- packages\selenium\webdriver\remote\webdriver.py", line 233, in execute 
    self.error_handler.check_response(response) 
    File "C:\Users\Surojit\AppData\Local\Programs\Python\Python35-32\lib\site- packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"id","selector":"Passwd"} 
Stacktrace: 
    at FirefoxDriver.prototype.findElementInternal_ (file:///C:/Users/Surojit/AppData/Local/Temp/tmpceecsm46/extensions/[email protected] glecode.com/components/driver-component.js:10770) 
    at FirefoxDriver.prototype.findElement (file:///C:/Users/Surojit/AppData/Local/Temp/tmpceecsm46/extensions/[email protected] glecode.com/components/driver-component.js:10779) 
    at DelayedCommand.prototype.executeInternal_/h (file:///C:/Users/Surojit/AppData/Local/Temp/tmpceecsm46/extensions/[email protected] glecode.com/components/command-processor.js:12661) 
    at DelayedCommand.prototype.executeInternal_ (file:///C:/Users/Surojit/AppData/Local/Temp/tmpceecsm46/extensions/[email protected] glecode.com/components/command-processor.js:12666) 
    at DelayedCommand.prototype.execute/< (file:///C:/Users/Surojit/AppData/Local/Temp/tmpceecsm46/extensions/[email protected]/components/command-processor.js:12608) 

Простой код, который я написал:

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import By 
import time 

browser = webdriver.Firefox() 
browser.get('http://gmail.com') 
action = webdriver.ActionChains(browser) 
emailElem = browser.find_element_by_id('Email') 
emailElem.send_keys("MyUserName") 
browser.find_element_by_name('signIn').click() 
#browser.get('https://accounts.google.com/ServiceLogin?   service=mail&continue=https://mail.google.com/mail/#password') 
passwordElem = browser.find_element_by_id('Passwd') 
passwordElem.send_keys("MyPassword") 
browser.find_element_by_name('signIn').click() 

Кроме того, я попытался выяснить ошибку в мой код, сравнив его с ответом, заданным на аналогичный вопрос, по адресу: Auto connect on my Gmail account with Python Selenium

Может кто-нибудь, пожалуйста, проведет меня по правильному пути и сообщит мне, где я делаю ошибку?

P.S: Это мой первый пост в stackoverflow. Пожалуйста, извините меня за любую ошибку, которую я сделал при размещении вопроса

+1

Вы могли бы использовать правильный API, а не что-то, что может сломаться в любой момент? https://developers.google.com/gmail/api/quickstart/python –

ответ

3

Вы пытаетесь найти Passwd идентификатор элемент, который еще не загружен в dom. Попробуйте добавить некоторую задержку, чтобы страница могла загружаться.

emailElem = browser.find_element_by_id('Email') 
emailElem.send_keys('MyUserName') 
nextButton = browser.find_element_by_id('next') 
nextButton.click() 
time.sleep(1) 
passwordElem = browser.find_element_by_id('Passwd') 
passwordElem.send_keys('MyPassword') 
signinButton = browser.find_element_by_id('signIn') 
signinButton.click() 

рекомендуется метод browser.implicitly_wait(num_of_seconds) см this

+0

Спасибо! @ Dnit13. Это отлично работает, мне не хватает команды сна. –

0

Проблема заключается в том, что gmail изменил способ входа в систему. Вы вставляете свою электронную почту на одной странице, то нажмите кнопку Далее, а затем вы получите новую страницу, где вы вставить пароль и нажмите на знак в Попробуйте что-то вроде этого:.

from selenium import webdriver 
browser = webdriver.Firefox() 

browser.get('http://gmail.com') 

emailElem = browser.find_element_by_id('Email') 
emailElem.send_keys('MyUserName') 
nextButton = browser.find_element_by_id('next') 
nextButton.click() 
passwordElem = browser.find_element_by_id('Passwd') 
passwordElem.send_keys('MyPassword') 
signinButton = browser.find_element_by_id('signIn') 
signinButton.click() 
1

Вы можете использовать ключ, чтобы избежать еще один поиск для следующего элемента

from selenium.webdriver.common.keys import Keys 

    def login_gmail(email,password): 

    browser.find_element_by_name('Email').send_keys(email+Keys.ENTER) 
    time.sleep(2) 
    browser.find_element_by_name('Passwd').send_keys(password+Keys.ENTER) 
0

Попробуйте использовать явные ожидания, когда нужно ждать какого-либо элемента. Это лучше, чем time.sleep(1).

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

browser = webdriver.Firefox() 
browser.get('http://gmail.com') 
wait = WebDriverWait(browser, 10) 

password_elem = wait.until(EC.presence_of_element_located((By.ID,'Passwd'))) 
password_elem.send_keys("MyPassword") 
browser.find_element_by_name('signIn').click() 

Надежда, это поможет вам.

0

Вы можете сделать это, но я бы не рекомендовал автоматизировать что-то вроде gmail. Это не было бы хорошей практикой. Для тестирования электронной почты - я бы предложил такой инструмент, как: https://putsbox.com/

Смежные вопросы