2016-04-02 30 views
1

PythonのSeleniumパッケージを使ってGMailへのログインを自動化しようとしています。しかし、私は、タスクを達成すると、次のエラーを取得することはできませんよ。Python-Seleniumを使ったGMAILログインの自動化

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ではなく、適切なAPIを使用できますか? https://developers.google.com/gmail/api/quickstart/python –

答えて

3

あなたがのPasswd IDを見つけようとしていますまだ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() 

推奨される方法あなたは

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

ありがとうございます! @ dnit13。これは完全に動作し、私はsleepコマンドを逃していました。 –

0

問題はGmailのログイン方法の変更です。もしあなたがパスワードを挿入し、サインインをクリックして新しいページを取得し、次の[OK]をクリックしますその後、1つのページにあなたの電子メールを挿入し、このような何かを試してみてください:。

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

を参照してくださいbrowser.implicitly_wait(num_of_seconds)です。それはより良いです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

は、あなたが任意の要素を待つ必要があるときに、明示的待機を使用してみてください、次の要素のための1つ以上の検索を避けるために、キーを使用することができますthis

0

これは可能ですが、Gmailのような自動化はお勧めしません。それは良い習慣ではないでしょう。メールをテストするには - https://putsbox.com/

関連する問題