带有Selenium Gmail电子邮件的Python发送自动至:字段给我带来了麻烦

时间:2018-08-08 21:44:56

标签: python selenium automation gmail

最终的目标是,如果我的公共IP地址发生更改,请向我发送电子邮件,因为我没有动态dns,因此必须手动为我的Web服务器输入自己的IP地址。我已经尽力尝试让bash实用程序为我完成这项工作,但是无论我如何配置出站邮件,CenturyLink都无法阻止我。

因此,我已经转向图形化python / selenium网页自动化,它将为我登录我的gmail帐户,单击“撰写”按钮,然后输入“收件人:”,“主题:”和文本段,然后点击“发送” 。除了一小部分-To:字段,其他所有内容都可以正常工作。 html / css与其他所有HTML / css都不一样,无论我如何尝试使用

driver.find_element_by_class_name()

driver.find_element_by_id()

我似乎无法填写该字段。 Bash会给我类似

的错误
:lo cannot be reached by keyboard 

或     textarea#:lo.vO不是有效的选择器

当我检查元素时,该元素如下所示:

<textarea rows="1" id=":lo" class="vO" name="to" spellcheck="false" autocomplete="false" autocapitalize="off" autocorrect="off" tabindex="1" dir="ltr" aria-label="To" role="combobox" aria-autocomplete="list" style="width: 462px;"></textarea>

到目前为止,我的代码是这样的:(注意:这还不包括获取ip信息,仅是Gmail登录/操作)

from selenium import webdriver
import time

driver = webdriver.Firefox();
driver.get('https://www.gmail.com');
username = driver.find_element_by_id('identifierId');
username.send_keys("EMAIL");
driver.find_elements_by_class_name('RveJvd.snByac')[1].click();
time.sleep(2); #password not entered in username field
password = driver.find_element_by_class_name('whsOnd.zHQkBf');
password.send_keys("PASSWORD");
driver.find_elements_by_class_name('RveJvd.snByac')[0].click();

#end login, start composing

time.sleep(5); #wait for sign in
driver.find_element_by_class_name('T-I.J-J5-Ji.T-I-KE.L3').click();
to = driver.find_element_by_class_name('textarea#:lo.vO'); #incorrect
to.send_keys("EMAIL");
subject = driver.find_element_by_id(':l6');
subject.send_keys("IP Address changed");
content = driver.find_element_by_id(':m9');
content.send_keys("Test Test\n");

4 个答案:

答案 0 :(得分:1)

您是否尝试过使用Gmail API? 比使用Selenium更快,更高效。

以下是快速入门:https://developers.google.com/gmail/api/quickstart/python

(我正在写一个答案,因为我不敢发表评论)

答案 1 :(得分:1)

您还可以使用Python的内置电子邮件包:

https://docs.python.org/3/library/email.examples.html

答案 2 :(得分:1)

我认为在不同的浏览器中,元素ID似乎存在动态变化。对我来说,当我尝试编写邮件以获取XPATH时,我注意到XPATH是//*[@id=":oa"],但是在脚本启动时是//*[@id=":my"]

为此,我使用了使用XPATH //textarea[1]进行元素查询的方法,因为“收件人”部分始终是第一个textarea。事实证明,这可以在不同的浏览器会话中保持一致。

代码段

>>> d = webdriver.Chrome()
[14424:7728:0809/135301.805:ERROR:install_util.cc(597)] Unable to read registry value HKLM\SOFTWARE\Policies\Google\Chrome\MachineLevelUserCloudPolicyEnrollmentToken for writing result=2

DevTools listening on ws://127.0.0.1:12582/devtools/browser/31a5ab42-a4d2-46f3-95c6-a0c9ddc129d7
>>> d.get('https://www.gmail.com')
>>> d.find_element_by_xpath(xpath)
<selenium.webdriver.remote.webelement.WebElement (session="6072286733856e53b69af89ea981001c", element="0.42218760484088036-1")>
>>> d.find_element_by_xpath('//textarea[1]').send_keys('cswadhikar@gmail.com')

结果

compose

答案 3 :(得分:0)

尝试使用此代码使用 Gmail 发送电子邮件。 它具有“收件人”、“主题”和“发送”按钮功能:

driver.find_element(By.XPATH, '//*[@id=":k2"]/div/div').click()# 组合按钮 time.sleep(5)

driver.find_element(By.NAME, 'to').send_keys("输入收件人的电子邮件地址")#到撰写字段 time.sleep(2)

driver.find_element(By.NAME,'subjectbox').send_keys("This email is sent using selenium")# 撰写中的主题字段 time.sleep(2)

driver.find_element(By.XPATH,'///*[@id=":p3"]').click()#点击发送按钮

time.sleep(5)

driver.close()