Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python Selenium自动登录GMAIL_Python_Selenium_Selenium Webdriver_Gmail_Ui Automation - Fatal编程技术网

使用Python Selenium自动登录GMAIL

使用Python Selenium自动登录GMAIL,python,selenium,selenium-webdriver,gmail,ui-automation,Python,Selenium,Selenium Webdriver,Gmail,Ui Automation,我正在尝试使用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

我正在尝试使用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/fxdriver@googlecode.com/components/command-processor.js:12608) 
此外,我还试图通过将代码中的错误与以下类似问题的答案进行比较,找出代码中的错误:

有人能指引我走上正确的道路,让我知道我在哪里犯了错误吗


这是我关于stackoverflow的第一篇文章。请原谅我在发布问题时犯的任何错误。问题是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()

您正在尝试查找尚未加载到dom中的元素的
Passwd
id。尝试添加一些延迟,以便可以加载页面

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)

最好的方法是在需要等待任何元素时使用显式等待。这比时间好。睡眠(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()

希望,这会对你有所帮助。

你可以做到这一点,但我不推荐像gmail这样的自动化。这不是一个好的做法。对于测试电子邮件,我建议使用一种类似-

的工具,这种方法不再适用于我

我查阅了文档,找到了一系列其他的成功方法

尝试按名称搜索元素,它可以工作

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

这是一个更新的版本

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")
def loginToGmail():
从selenium导入webdriver
从selenium.webdriver.common.by导入
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
从时间上导入睡眠
chrome\u driver=“C:/Python37/chromedriver.exe”
浏览器=webdriver.Chrome(Chrome\u驱动程序)
browser.get('https://gmail.com')
如果browser.current\u url中有“收件箱”:
打印(“登录”)
其他:
identifier=WebDriverWait(浏览器,30)。直到(例如,元素的存在位置((By.NAME,“identifier”))
标识符。发送密钥(登录)
nextBtn=browser.find_element_by_id('identifierNext'))
nextBtn.单击()
睡眠(1)
password=WebDriverWait(浏览器,30)。直到(例如,存在位于((By.NAME,“password”))的元素)
密码。发送密钥(PASSWD)
nextBtn=browser.find_element_by_id('passwordNext'))
nextBtn.单击()
waitTimer=0
记录=错误

虽然waitTimer
我希望,它将有助于在更新的chrome版本中自动化gmail。

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()

2020年,使用Gmail登录要困难得多,因为Gmail将selenium操作的窗口作为一个机器人窗口,并将发出这样的信息

但现在我发现了一种成功的方法,可以在没有任何错误或谷歌警告的情况下登录

您可以登录到另一个网站,因为谷歌将接受使用StackOverflow或其他Gmail登录的网站作为安全登录

def gmail_sign_in(email, password):
    driver = webdriver.Chrome()

    driver.get('https://stackoverflow.com/users/signup?ssrc=head&returnurl=%2fusers%2fstory%2fcurrent')

    driver.find_element_by_xpath('//*[@id="openid-buttons"]/button[1]').click()

    driver.find_element_by_xpath('//*[@id="identifierId"]').send_keys(email)

    input = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="identifierNext"]/span/span'))
    )
    input.click()

    driver.implicitly_wait(1)

    driver.find_element_by_xpath('//*[@id="password"]/div[1]/div/div[1]/input').send_keys(password)

    input = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="passwordNext"]/span/span'))
    )
    input.click()
    driver.implicitly_wait(1)
    driver.get('https://www.google.com/')
希望代码是可以理解的只是这个功能,把你的电子邮件和密码,确保你有适当的导入

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

我有另一个解决方案,它可以不费力地工作。 配合使用


除此之外,seleniumwire还有许多很棒的特性,你可以使用一个合适的API,而不是任何时候都可能出现故障的API?我正在为Google Hangouts寻找这样的解决方案,但是我相信API只适用于GSuite。对于个人谷歌闲逛聊天,这里没有API,谢谢@第13条。这很好用,我错过了sleep命令。这是更新的一个…Gmail的密码是“id”到“class”。
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 seleniumwire.undetected_chromedriver.v2 import Chrome, ChromeOptions
options = {}
chrome_options = ChromeOptions()
chrome_options.add_argument('--user-data-dir=hash')
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-dev-shm-usage")
# chrome_options.add_argument("--headless")
driver = Chrome(seleniumwire_options=options, options=chrome_options)

# use selenium methods as usual to navigate through elements and you will be able to log in.