使用selenium+selenium发送QQ邮件
Posted aanb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用selenium+selenium发送QQ邮件相关的知识,希望对你有一定的参考价值。
参考 : 初识selenium-发送QQ邮件 链接------》https://blog.csdn.net/qiye005/article/details/80259607
前言:
为实现selenium+python自动发送QQ邮件功能,需要搭建的环境:安装selenium包(pip install selenium)及安装谷歌驱动器(http://chromedriver.storage.googleapis.com/index.html)。并且要了解要selenium进行元素定位的八大方法,详细的资料请自行网上搜索或者查看书籍。
具体需要什么知识基础请参考:
https://blog.csdn.net/huilan_same/article/details/52559711
---------------------
实现:
首先定义邮件发送的步骤:
第一步:打开浏览器,调到邮箱登录页面,输入账号密码并登录;
第二部:点击进入邮件编辑页面,输入地址、标题和内容,并发送;
第三部:关闭浏览器;
代码:
根据之前的动作分解,结合掌握的selenium进行元素定位的方法,实现下述python代码。
"""
此脚本主要参考:https://blog.csdn.net/vae0000/article/details/73162662
https://blog.csdn.net/vae0000/article/details/73179680
https://blog.csdn.net/qq_19655383/article/details/70141624
https://blog.csdn.net/qiye005/article/details/80259607
主要修改了输入的参数对代码进行了优化及对这些操作进行详细的相关说明,方便新手学习
最后修改日期:2018-11-16
V1.0 实现脚本化命令行方式自动发送邮件
V1.1封装登陆,写信,发送与退出子函数,并尝试调用
V1.2对代码进行优化及进行详细的说明
最后修改作者:sobbing_child
"""
from selenium import webdriver
#导入By类
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import time
# dr = webdriver.Chrome() #webdirver模块初始化Chrome对象
# dr.get("https://mail.qq.com")
# 函数名称: LoginFun(_username,_password)
# 函数功能: 实现根据指定QQ邮箱网页,账号,密码实现登陆QQ邮箱动作
# _dr:webdirver模块初始化Chrome对象
# _emailAddress:访问QQ邮箱网址
# _username:邮箱用户名
# _password:相应邮箱用户名密码
# 输出参数: 使用ID进行定位元素并直接进行send_keys操作并把切换表单去掉,函数clear()去掉
# 修改信息: 2018-11-16 sobbing_child
#封装进行登录的函数
def LoginFun(_dr,_emailAddress,_username,_password):
# 登录网址
_dr.get(_emailAddress)
# 根据ID切换表单
_dr.switch_to_frame("login_frame")
# 找到账好的ID,并进行输入
_dr.find_element(By.NAME,"u").send_keys(_username)
# 找到密码的ID,并进行输入
_dr.find_element(By.NAME,"p").send_keys(_password)
# 找到登录的ID并进行点击操作,隐式等待5秒
Login = _dr.find_element(By.ID,"login_button")
Login.click()
_dr.implicitly_wait(5)
# 函数名称 WriteAndSendFun(_driver,_receiverAddress,_subjectString,_contentString)
# 函数功能: 实现根据指定收件人定制,主题,新建邮件正文内容,实现填写及发送动作
#
# 输入参数: _dirver模块初始化Chrome对象
# _receiverAddress:收件人邮箱
# _subjectString:主题名称
# _contentString:邮件正文内容
# 输出参数: 对某些操作进行详细的说明及使用其它方式进行定位(ps:坑多,收件人定了一晚上没定到)
# 修改信息: 2018-11-16 sobbing_child
def WriteAndSendFun(_dr,_receiverAddress, _subjectString, _contentString):
#可以根据ID或者link_text方法进行定位元素
# writeLink = dr.find_element_by_link_text("写信")
writeLink = _dr.find_element(By.ID,"composebtn")
writeLink.click()
# 根据标签iframe的ID切换到写信框架
_dr.switch_to_frame("mainFrame")
#收件人信息 根据xpath方法定位,可以用其它方法但是这里用xpath方法进行定位准确
_dr.find_element_by_xpath("//*[@id=‘toAreaCtrl‘]/div/input").send_keys(_receiverAddress)
#邮件主题信息 根据ID进行定位
_dr.find_element(By.ID,"subject").send_keys(_subjectString)
#邮件正文信息 可以根据tag或者class_name进行表单的切换操作
#dr.switch_to_frame(dr.find_element_by_tag_name("iframe"))
_dr.switch_to_frame(_dr.find_element_by_class_name("qmEditorIfrmEditArea"))
_dr.find_element_by_tag_name("body").send_keys(_contentString)
#送信按钮触发
_dr.switch_to.parent_frame()
#webDriver只能在一个页面上对元素识别和定位,对于frame/iframe表单内嵌页面上的元素无法直接定位,
#此时就需要通过switch_to.frame()方法将当前定位的主题切换为iframe表单的内嵌页面中。
_dr.find_element_by_link_text("发送").click()
_dr.implicitly_wait(5)
# 定义主函数
def main():
#驱动存放位置
webDriverLoc = r‘C:UsersAdministratorAppDataLocalProgramsPythonPython36chromedriver.exe‘
dr = webdriver.Chrome(executable_path=webDriverLoc)
#QQ邮箱网址,账号密码相关
username = ‘登陆邮箱账号‘
password = ‘登陆邮箱密码‘
emailAddress="https://mail.qq.com/"
# 邮件内容定义
receiverAddress = "QQ邮箱"
subjectString = "selenup+python自动化测试"
contentString = "这是邮件正文,测试,测试"
# 调用登陆操作子函数
LoginFun(dr,emailAddress,username,password)
# 调用写信与发送操作子函数
WriteAndSendFun(dr,receiverAddress, subjectString, contentString)
# 最后调用退出操作子函数
dr.close()
# 调用主函数
if __name__ == "__main__":
main()
# ---------------------
# 作者:sobbing_child
# 来源:QiYe005
# 原文:https://blog.csdn.net/qiye005/article/details/80259607
# 版权声明:本文为博主原创文章,转载请附上博文链接!
接下来进行详细的说明,先看如下代码及图片
根据元素的name进行定位(账号和密码):
切换表单:
根据元素的ID进行定位(登录):
# 登录网址
_dr.get(_emailAddress)
# 根据ID切换表单
_dr.switch_to_frame("login_frame")
# 找到账好的ID,并进行输入
_dr.find_element(By.NAME,"u").send_keys(_username)
# 找到密码的ID,并进行输入
_dr.find_element(By.NAME,"p").send_keys(_password)
# 找到登录的ID并进行点击操作,隐式等待5秒
Login = _dr.find_element(By.ID,"login_button")
Login.click()
_dr.implicitly_wait(5)
从图中可以看出各界面对应的ID及NAME的值,这里用的是根据NAME的值,注意要先切换到表单再进行操作,也可以使用其它方法进行定位这样定位较为清晰明了
再来看下面的代码,进入写信的阶段:
根据元素的ID进行定位(写信):
# writeLink = dr.find_element_by_link_text("写信")
writeLink = _dr.find_element(By.ID,"composebtn")
writeLink.click()
根据标签iframe的ID切换到写信框架:
_dr.switch_to_frame("mainFrame")
收件人信息,根据xpath方法定位,这里不知道为什么你把箭头指向收信人的时候是固定的div这里,
楼主在这里一直根据div里面class、style进行定位一直不能send.keys。其实是要定位到input,
其实自己想一下收件人,登录等操作的tag通常是input。
_dr.find_element_by_xpath("//*[@id=‘toAreaCtrl‘]/div/input").send_keys(_receiverAddress)
根据元素的ID进行定位(主题信息):
_dr.find_element(By.ID,"subject").send_keys(_subjectString)
邮件正文信息,这里要说明下这里的ID级NAME是变化的,这个时候可以根据tag或者class_name,xpath方法进行定位:
#dr.switch_to_frame(dr.find_element_by_tag_name("iframe"))
_dr.switch_to_frame(_dr.find_element_by_class_name("qmEditorIfrmEditArea"))
_dr.find_element_by_tag_name("body").send_keys(_contentString)
webDriver只能在一个页面上对元素识别和定位,对于frame/iframe表单内嵌页面上的元素无法直接定位,
此时就需要通过switch_to.frame()方法将当前定位的主题切换为iframe表单的内嵌页面中:
_dr.switch_to.parent_frame()
_dr.find_element_by_link_text("发送").click()
_dr.implicitly_wait(5)
接下来就是函数的封装了,自己填入收件人、正文等,这里不再做陈述,有疑问欢迎留言!
# ---------------------
# 作者:sobbing_child
# 来源:QiYe005
# 原文:https://www.cnblogs.com/aanb/
# 版权声明:本文为博主原创文章,转载请附上博文链接
:
以上是关于使用selenium+selenium发送QQ邮件的主要内容,如果未能解决你的问题,请参考以下文章