【问题标题】:Write and send Gmail with Selenium for Python使用 Selenium for Python 编写和发送 Gmail
【发布时间】:2021-05-16 18:49:38
【问题描述】:

我刚刚开始第一次在 Python 中使用 selenium,在学习了一个快速教程之后,我现在正在尝试使用它制作一个程序,该程序将登录到 Gmail,然后将电子邮件发送到选定的电子邮件地址。

我已经完成了登录部分,但在撰写新的电子邮件部分时遇到了一些问题(仅在某些时候有效),而且每次写邮件正文时都会卡住。

我的代码在下面,我尝试阅读文档,但我无法在 Gmail 中使用以下内容,当我检查 gmail 中的元素时,它似乎比示例中的基本 html 结构复杂得多:

http://selenium-python.readthedocs.org/locating-elements.html#locating-elements-by-tag-name

"""
Write a program that takes an email address and string of text on the command line and then, using Selenium,
logs into your email account and sends an email of the string to the provided address. 
"""

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

browser = webdriver.Chrome()
browser.get('http://www.gmail.com')

emailElem = browser.find_element_by_id('Email')
emailElem.send_keys('My_email@gmail.com')
emailElem.submit()

time.sleep(2)

passwordElem = browser.find_element_by_id('Passwd')
passwordElem.send_keys('My_password_here')
passwordElem.submit()


time.sleep(2)

composeElem = browser.find_element_by_class_name('z0') #this only works half of the time
composeElem.click()

time.sleep(7)

toElem = browser.find_element_by_name("to")
toElem.send_keys('my_other_email@gmail.com')

time.sleep(2)

subjElem = browser.find_element_by_name("subjectbox")
subjElem.send_keys('Test with selenium')

time.sleep(2)

bodyElem = browser.find_element_by_???('???') #this is where I get stuck and not sure what to do here
bodyElem.send_keys('A test email with selenium')

time.sleep(2)

sendElem = browser.find_element_by_link_text('send') #not sure if this is correct too
sendElem.submit()

【问题讨论】:

  • 什么是 find_element_by_????
  • 我放在那里的问号表示我不清楚该做什么,我已经厌倦了通过类名、标签、标题文本和其他东西找到它们,但它们都没有用....

标签: python selenium-webdriver


【解决方案1】:

我认为在加载的页面上选择元素的最简单方法是通过 css 选择器找到它们。您可以在浏览器检查器中找到它们,然后复制它们唯一的 css 选择器(在 Firefox 中按检查元素 -> 复制唯一选择器)。在这种情况下,这应该有效:

browser.find_element_by_css_selector('#\:nw')

【讨论】:

  • 好的,谢谢,我之前确实尝试过使用 ':nw',但没有运气,现在就试一试
  • 这个方法不起作用 恐怕,它返回这个错误:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector" ,"选择器":"#\:nw"}
  • 嗯,它对我有用,但是当页面完全加载时,我从交互式 shell 启动它。当页面上还没有元素时,会出现此类异常。因此,首先,从交互式 shell 中尝试,对于自动化脚本,您可以使用 selenium 等待 (selenium-python.readthedocs.org/waits.html)。使用显式等待最后一个 find_element,或隐式删除所有 time.sleep。
  • 抱歉,我没有从 shell 运行它,它确实可以这样工作,谢谢,现在将尝试等待
【解决方案2】:

请尝试:

time.sleep(10)

bodyElem = browser.find_element_by_xpath("//*[@id=":ov"]")

bodyElem = browser.find_element_by_xpath("//*[@id=":ou"]")

我认为查找元素需要更多时间,所以我增加了睡眠时间,并且 xpath 应该可以工作。

【讨论】:

  • 这些都不起作用我担心,使用 :ov 它会返回此错误:selenium.common.exceptions.ElementNotVisibleException:消息:元素不可见并且:ou 这个错误:selenium.common.exceptions。 NoSuchElementException:消息:没有这样的元素:无法找到元素:{"method":"xpath","selector":"//*[@id=":ou"]"}
  • 似乎很多元素也发生了变化,导致它出现问题,我注意到我用于 composeElem 的“z0”类名只有在我每次运行它时完全退出 Chrome 时才有效,否则元素不在那里。对于我每次都在源'aria-label="Message Body"'中看到的消息正文,我将如何告诉 selenium 使用该元素?
  • 对我来说,同样的代码正在工作,所以它应该适合你。
【解决方案3】:

由于 id 每次都在变化,我们可以检查 aria-label :

browser.find_element_by_css_selector("div[aria-label='Message Body']")

对于send,使用这个:

sendElem = browser.find_element_by_xpath("//div[text()='Send']")
sendElem.click()

【讨论】:

    【解决方案4】:

    找到消息框后,您也可以使用以下方法破解它(我是菜鸟,无法发送到工作)

    sendElem.send_keys(Keys.TAB) sendElem.send_keys(Keys.CONTROL + Keys.RETURN)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2020-06-13
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      相关资源
      最近更新 更多