Python+Selenium实现读取网易邮箱验证码


Posted in Python onMarch 13, 2022

前面写到了一些关于python+Selenium的基础操作 的教程,这篇文章将讲解一些实战内容。

在自动化工作中,有可能会遇到一些发送邮箱验证码类似的功能,如下

Python+Selenium实现读取网易邮箱验证码

我们一般的解决思路就是 :

发送邮件—>打开邮箱—>输入邮箱账户密码—>登录邮箱—>打开未读邮件—>获取验证码—>保存验证码—>读取验证码

以下是一个实现打开网易邮箱读取未读邮件获取验证码的代码

def wangyi(self,username, password, name):
        dr = webdriver.Edge()  # 打开另一个浏览器
        dr.maximize_window()  # 窗口最大化
        dr.get("https://mail.163.com/")  # 打开QQ邮箱
        time.sleep(2)
        iframe = dr.find_element(by="xpath",
                                     value="/html/body/div[2]/div[3]/div[1]/div/div[4]/div[1]/div[1]/iframe")
        dr.switch_to.frame(iframe)  # 切换至内嵌页面
        time.sleep(0.5)
        dr.find_element(by="name", value="email").clear()  # 清除内容
        time.sleep(0.5)
        dr.find_element(by="name", value="email").send_keys(username)  # 输入账户
        time.sleep(0.5)
        dr.find_element(by="name", value="password").clear()  # 清除内容
        time.sleep(0.5)
        dr.find_element(by="name", value="password").send_keys(password)
        time.sleep(0.5)
        dr.find_element(by="id", value="dologin").click()  # 进入邮箱首页
        dr.switch_to.parent_frame()  # 切回父级页面
        time.sleep(2)
        num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量
        if int(num) > 0:
            print("存在未读邮件")
            dr.find_element(By.ID, "gWel-animMailIcon").click()  # 点击未读邮件
            time.sleep(2)
            count = dr.find_elements(By.CLASS_NAME, "da0")
            print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件
            for i in range(1, len(count)):
                emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名
                print(emailname)
                print(name)
                if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作
                    dr.find_element(By.CLASS_NAME, 'da0').click()  # 点击邮件查看详情
                    time.sleep(1)
                    iframe = dr.find_element(By.XPATH,
                                                 "/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe")  #
                    # 定位内嵌页面
                    dr.switch_to.frame(iframe)  # 切换到内嵌页面
                    time.sleep(1)
                    res = dr.find_element(By.CLASS_NAME,
                                              'netease_mail_readhtml.netease_mail_readhtml_webmail').text  # 获取整个邮件信息
                    print(res)
                    dr.switch_to.parent_frame()  # 切回父级界面
                    self.code = re.findall(pattern="\d+", string=res)  # 使用正则表达式获取邮箱验证码
                    print(self.code)
                    break  # 获取完成退出遍历
        else:
            print('不存在未读邮件')  # 如果没有找到则打印没有找到
        # dr.quit()  # 关闭浏览器

打开邮箱我们会发现,登录这一个小版块是一个内嵌页面,所以一般的定位方法都会定位失败,会报无法点击到该元素,或者找不到该元素的错误,这是我们就会用到dr.switch_to.frame(iframe) 切换至内嵌页面的方法,当我们切换到内嵌页面的时候,就可以对内嵌页面中的元素进行定位操作。但如果操作完成后希望到内嵌页面外进行操作的话,就需要使用dr.switch_to.parent_frame() 把焦点切回父级界面。

Python+Selenium实现读取网易邮箱验证码

进入邮箱后,首先要判断是否收到了邮件,所以通过未读邮件右上角的角标来判断是否收到了邮件,如果收到了才进行下一步操作,如果没有收到则提示没有收到邮件,当然也可以优化一下,设置一个循环,定时多久查看一次,超过多少时间则报错。

Python+Selenium实现读取网易邮箱验证码

这边是用了text方法去获取角标文本进行判断,当然获取的文本是str 格式的,需要使用INT方法进行转为整型进行判断

num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量
        if int(num) > 0:
            print("存在未读邮件")
        else:
            print("未收到邮件")

判断存在未读邮件后,我们点入未读邮件中,去查看未读邮件信息,首先,我们要获取未读邮件文本信息进行遍历比对,点进去可以发现,邮件的属性可以使用Class_name进行匹定位,但是一样的Class_name有邮件数量+1个,研究后发现第一封邮件的定位为第二个,所以使用遍历 for i in range(1, len(count)),从第二个元素开始,len(count)中的count指的是该元素,len(count)返回值为该元素的数量也就是邮件数量+1,

Python+Selenium实现读取网易邮箱验证码

实现代码:

count = dr.find_elements(By.CLASS_NAME, "da0")
            print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件
            for i in range(1, len(count)):
                emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名
                print(emailname)
                print(name)
                if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作
                    print("找到邮件执行下一步")
                else:
                    print("未找到邮件")

找到邮件后需要获取文本信息,可以观察到,文本信息还是比较简单的,其中就只有验证码是数字,所以使用简单的正则匹配可以轻松的将数字匹配出来,值得注意的是,文本内容也是一个内嵌页面,所以也需要切换焦点

Python+Selenium实现读取网易邮箱验证码

具体实现代码:

dr.find_element(By.CLASS_NAME, 'da0').click()  # 点击邮件查看详情
time.sleep(1)
iframe = dr.find_element(By.XPATH,"/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe")  
# 定位内嵌页面
dr.switch_to.frame(iframe)  # 切换到内嵌页面
time.sleep(1)
res = dr.find_element(By.CLASS_NAME, 'netease_mail_readhtml.netease_mail_readhtml_webmail').text  # 获取整个邮件信息
print(res)
dr.switch_to.parent_frame()  # 切回父级界面
self.code = re.findall(pattern="\d+", string=res)  # 使用正则表达式获取邮箱验证码

返回结果:

Python+Selenium实现读取网易邮箱验证码

因为返回结果是一个列表,所以后续使用是需要使用code[0]取出

完整功能代码:

import re
import time
from selenium import webdriver
from selenium.webdriver.common.by import By


"""
使用 Selenium 完成 通过验证码修改密码操作--网易邮箱在未读邮件中获取验证码 

change_pwd 方法中:
password 登录密码
newpassword 新密码
url : 网站地址 

wangyi 方法中:
username:邮箱账户
password:邮箱密码
name:你期望匹配的邮件名字
"""


class Get_Code:

    def change_pwd(self,password,newpassword,url):
        driver = webdriver.Chrome()  # 打开浏览器
        driver.get(url)
        driver.maximize_window()  # 窗口最大化
        time.sleep(0.5)
        driver.find_element(by=By.XPATH, value="/html/body/div/div/div[1]/div/div[2]/div[3]/div[1]").click()  # 点击登录
        time.sleep(1)
        driver.find_element(by=By.ID, value="horizontal_login_userAccount").send_keys("selenium3366@163.com")  # 输入登录账户
        driver.find_element(by=By.ID, value="horizontal_login_password").send_keys(password)  # 输入登录密码
        driver.find_element(by=By.CLASS_NAME, value="atn-btn-orange.ant-btn.ant-btn-lg.ant-btn-block").click()  # 点击登录
        time.sleep(2)
        driver.find_element(by=By.XPATH,
                            value="""//*[@id="app"]/div/div[1]/div/div[2]/div[3]/div[1]""").click()  # 点击头像进入个人中心
        time.sleep(2)
        driver.find_element(by=By.XPATH,
                            value="""//*[@id="app"]/div/div[2]/div[1]/div[2]/div[3]""").click()  # 点击change_password
        time.sleep(1)
        driver.find_element(by=By.XPATH, value="""//*[@id="horizontal_login_newPassword"]""").send_keys(
            newpassword)  # 输入新密码
        driver.find_element(by=By.XPATH,
                            value="""//*[@id="app"]/div/div/div[2]/form/div[2]/div/div/span/div/div[2]/a""").click()  # 点击发送验证码
        time.sleep(8)  # 等待验证码发送到该邮箱

        self.wangyi(username="selenium3366", password="*******, name="okmarket账户信息更改")  # 调用方法获取验证码

        driver.find_element(by=By.XPATH, value=
        "/html/body/div[1]/div/div/div[2]/form/div[2]/div/div/span/div/div[1]/input").send_keys(
            self.code[0])  # 输入验证码
        time.sleep(0.5)
        driver.find_element(by=By.XPATH, value=
        """/html/body/div[1]/div/div/div[2]/form/div[3]/div/div/span/button""").click()  # 点击按钮
        time.sleep(1)
        text = driver.find_element(by=By.XPATH, value="""/html/body/div[2]/span/div/div/div/span""").text
        print(text)
        try:
            assert text == "password update success"        #断言
            print("修改密码成功")
        except:
            print("修改失败")

    def wangyi(self,username, password, name):
        dr = webdriver.Edge()  # 打开另一个浏览器
        dr.maximize_window()  # 窗口最大化
        dr.get("https://mail.163.com/")  # 打开QQ邮箱
        time.sleep(2)
        iframe = dr.find_element(by="xpath",
                                     value="/html/body/div[2]/div[3]/div[1]/div/div[4]/div[1]/div[1]/iframe")
        dr.switch_to.frame(iframe)  # 切换至内嵌页面
        time.sleep(0.5)
        dr.find_element(by="name", value="email").clear()  # 清除内容
        time.sleep(0.5)
        dr.find_element(by="name", value="email").send_keys(username)  # 输入账户
        time.sleep(0.5)
        dr.find_element(by="name", value="password").clear()  # 清除内容
        time.sleep(0.5)
        dr.find_element(by="name", value="password").send_keys(password)
        time.sleep(0.5)
        dr.find_element(by="id", value="dologin").click()  # 进入邮箱首页
        dr.switch_to.parent_frame()  # 切回父级页面
        time.sleep(2)
        num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量
        if int(num) > 0:
            print("存在未读邮件")
            dr.find_element(By.ID, "gWel-animMailIcon").click()  # 点击未读邮件
            time.sleep(2)
            count = dr.find_elements(By.CLASS_NAME, "da0")
            print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件
            for i in range(1, len(count)):
                emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名
                print(emailname)
                print(name)
                if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作
                    dr.find_element(By.CLASS_NAME, 'da0').click()  # 点击邮件查看详情
                    time.sleep(1)
                    iframe = dr.find_element(By.XPATH,
                                                 "/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe")  #
                    # 定位内嵌页面
                    dr.switch_to.frame(iframe)  # 切换到内嵌页面
                    time.sleep(1)
                    res = dr.find_element(By.CLASS_NAME,
                                              'netease_mail_readhtml.netease_mail_readhtml_webmail').text  # 获取整个邮件信息
                    print(res)
                    dr.switch_to.parent_frame()  # 切回父级界面
                    self.code = re.findall(pattern="\d+", string=res)  # 使用正则表达式获取邮箱验证码
                    print(self.code)
                    break  # 获取完成退出遍历
        else:
            print('不存在未读邮件')  # 如果没有找到则打印没有找到
        # dr.quit()  # 关闭浏览器


if __name__ == '__main__':
    a = Get_Code()
    a.change_pwd(password="a123456",newpassword="a1234567",url="*******")

完整效果演示:

Python+Selenium实现读取网易邮箱验证码

以上就是Python+Selenium实现读取网易邮箱验证码的详细内容,更多关于Python Selenium读取邮箱验证码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
浅析python 内置字符串处理函数的使用方法
Jun 11 Python
在Python的Flask框架中实现全文搜索功能
Apr 20 Python
Python中subprocess模块用法实例详解
May 20 Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
tensorflow实现简单的卷积神经网络
May 24 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
asyncio异步编程之Task对象详解
Mar 13 #Python
实例详解Python的进程,线程和协程
Python获取指定日期是"星期几"的6种方法
Python+tkinter实现高清图片保存
Python中的 Set 与 dict
Mar 13 #Python
Python echarts实现数据可视化实例详解
分享3个非常实用的 Python 模块
Mar 03 #Python
You might like
PHP利用COM对象访问SQLServer、Access
2006/10/09 PHP
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
PHP 文件扩展名 获取函数
2009/06/03 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
JavaScript的eval JSON object问题
2009/11/15 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
Vue数据绑定简析小结
2019/05/07 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
python 处理string到hex脚本的方法
2018/10/26 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
新闻系毕业生推荐信
2013/11/16 职场文书
电子商务专业个人的自我评价
2013/12/19 职场文书
最新党员思想汇报
2014/01/01 职场文书
财政专业求职信范文
2014/02/19 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python