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 01 Python
python数据处理实战(必看篇)
Jun 11 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
pandas多级分组实现排序的方法
Apr 20 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
Django中的forms组件实例详解
Nov 08 Python
对Python w和w+权限的区别详解
Jan 23 Python
pymysql 开启调试模式的实现
Sep 24 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 Python
Python实现socket库网络通信套接字
Jun 04 Python
Python 中的Sympy详细使用
Aug 07 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
基于qmail的完整WEBMAIL解决方案安装详解
2006/10/09 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
PHP基础教程(php入门基础教程)一些code代码
2013/01/06 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
Angularjs 基础入门
2014/12/26 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
Python 爬虫性能相关总结
2020/08/03 Python
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
元旦晚会邀请函
2014/02/01 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
诉前财产保全担保书
2014/05/20 职场文书
励志演讲稿600字
2014/08/21 职场文书
装配出错检讨书
2014/09/23 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
python基础之//、/与%的区别详解
2022/06/10 Python