web-dev-qa-db-ja.com

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/fxdriver@goo glecode.com/components/driver-component.js:10770)
     at FirefoxDriver.prototype.findElement   (file:///C:/Users/Surojit/AppData/Local/Temp/tmpceecsm46/extensions/fxdriver@goo  glecode.com/components/driver-component.js:10779)
    at DelayedCommand.prototype.executeInternal_/h   (file:///C:/Users/Surojit/AppData/Local/Temp/tmpceecsm46/extensions/fxdriver@goo    glecode.com/components/command-processor.js:12661)
    at DelayedCommand.prototype.executeInternal_    (file:///C:/Users/Surojit/AppData/Local/Temp/tmpceecsm46/extensions/fxdriver@goo 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()

また、コード内のエラーを、次の同様の質問に対する回答と比較して見つけようとしました: GmailアカウントでPython Selenium)を使用して自動接続します

誰かが私を正しい道に導き、どこで間違いを犯しているのか教えてもらえますか?

追伸:これはstackoverflowに関する私の最初の投稿です。質問の投稿で間違いを犯したことをお詫びします

5
arpita_taurus

まだdomにロードされていない要素のPasswdidを見つけようとしています。ページが読み込まれるように、遅延を追加してみてください。

_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) see this

3
dnit13

I hope that, it will be helpful for automate the gmail in updated chrome version.

from Selenium import webdriver
import time


driver = webdriver.Chrome()
driver.get("http://gmail.com")

driver.find_element_by_id("identifierId").send_keys('your mail id')
driver.find_element_by_id("identifierNext").click()
time.sleep(5)
driver.find_element_by_name("password").send_keys('your password')
driver.find_element_by_id("passwordNext").click()
time.sleep(5)

driver.get("https://accounts.google.com/SignOutOptions?hl=en&continue=https://mail.google.com/mail&service=mail")
driver.find_element_by_xpath('//button[normalize-space()="Sign out"]').click()
driver.close()
2
Priya

キーを使用して、次の要素をもう一度検索しないようにすることができます

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)
1
Ankit Tiwari

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

1
Chirag verma

IDのシャーリングメソッドは、私にとっても機能しなくなりました。

私はドキュメントをチェックして、成功するための他の方法をたくさん見つけました。

NAMEで要素を検索してみてください。機能します。

password = wait.until(
EC.element_to_be_clickable((By.NAME,'password')))

CLASS_NAME

1
Carlo Cattano

最良の方法は、要素を待機する必要がある場合に明示的な待機を使用することです。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
Alex Makarenko

これはより更新されたバージョンです

def loginToGmail():
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
from time import sleep




chrome_driver = "C:/Python37/chromedriver.exe"
browser = webdriver.Chrome(chrome_driver) 
browser.get('https://gmail.com')

if "inbox" in browser.current_url:
    print("Logged in")
else:
    identifier=WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.NAME, "identifier"))) 
    identifier.send_keys(LOGIN)
    nextBtn = browser.find_element_by_id ('identifierNext')
    nextBtn.click()
    sleep(1)
    password=WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.NAME, "password")))
    password.send_keys(PASSWD)
    nextBtn = browser.find_element_by_id('passwordNext')
    nextBtn.click()

    waitTimer=0
    logged=False
    while waitTimer<30 and not logged:
        sleep(1)
        waitTimer+=1
        if "inbox" in browser.current_url: 
            logged=True
            print("Logged in")
0
Teodoros

問題は、Gmailがログインの動作方法を変更したことです。 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()
0
mvidovic