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() 把焦点切回父级界面。

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

这边是用了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,

实现代码:

            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("未找到邮件")

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

具体实现代码:

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)  # 使用正则表达式获取邮箱验证码

返回结果:

因为返回结果是一个列表,所以后续使用是需要使用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读取邮箱验证码的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python +Selenium解决图片验证码登录或注册问题(推荐)

    1. 解决思路 首先要获得这张验证码的图片,但是该图片一般都是用的js写的,不能够通过url进行下载. 解决方案:截图然后根据该图片的定位和长高,使用工具进行裁剪 裁剪完毕之后,使用工具解析该图片. 2. 代码实现 2.1 裁剪出验证码图片 裁剪图片需要使用 Pillow 库,进入pip包路径后输入安装命令pip install Pillow: 之前安装的时候忘记了截图,只能够截一张安装后的图片了 ╰(:з╰∠)_ 安装完成后,代码实现方式如下: #coding=utf-8 from selen

  • selenium+python实现自动登陆QQ邮箱并发送邮件功能

    本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家. (浏览器为Chrome) (如果只需要最终的完整代码,请直接跳转到文章最后) 浏览器打开QQ邮箱登录网址 QQ邮箱登录地址为:https://mail.qq.com/ from selenium import webdriver import time zhengyi = webdriver.Chrome() zhengyi.get('https://mail.qq.com/') 这一步没有遇到问题,至于为什

  • python3+selenium实现126邮箱登陆并发送邮件功能

    本文实例为大家分享了python3实现126邮箱登陆并发送邮件的具体代码,供大家参考,具体内容如下 基于selenium,使用chrome浏览器,完成126邮箱登陆并发送发邮件功能,暂时未封装. from selenium import webdriver # 导入显示等待类 from selenium.webdriver.support.ui import WebDriverWait # 导入期望场景类 from selenium.webdriver.support import expect

  • python+opencv+selenium自动化登录邮箱并解决滑动验证的问题

    前言 大家做自动化登录时可能都遇到过滑块验证码需要手动验证的问题,这次我们就来解决他 如下:    在我们做自动化登录时,总会遇到各种奇奇怪怪的验证码,滑块验证码就是其中最常见的一种.若我们的程序自动输入账号密码之后,还需要我们人工去滑动验证码那还能称得上是自动化吗? 那么先给大家说一下我的'解题步骤'. 1.使用selenium打开邮箱首页. 2.定位到账号密码框,键入账号密码. 3.获取验证图片,使用opencv处理返回滑块应拖动的距离. 4.创建鼠标事件,模拟拖动滑块完成验证.   需要解

  • python+selenium实现163邮箱自动登陆的方法

    本文介绍了 让我们先来预览一下代码运行效果吧: 首先分析163邮箱登陆页面的网页结构(按F12或单击鼠标右键选择审查元素) 1.定位到登陆框(注意登录框是一个iframe,如果不定位到iframe的话是无法找到之后的邮箱地址框和密码输入框的) 2.定位到邮箱地址框(name='email') 3.定位到密码输入框(name='password') 4.定位到登陆按钮(id='dologin') 5.分析完毕,现在就可以写代码实现163邮箱的自动登陆啦(附有代码的详细解析!) #coding:ut

  • 利用Python+Selenium破解春秋航空网滑块验证码的实战过程

    目录 前言 开发工具 环境搭建 实战记录 一. 验证码简介 二.破解滑块验证码 2.1 计算滑块到缺口的距离 2.2 将滑块拖到缺口位置 前言 记录一次利用Python+Selenium破解滑块验证码的实战过程. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pillow模块: selenium模块: numpy模块: 以及一些Python自带的模块. 其他: chromedriver 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 实战

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

    前面写到了一些关于python+Selenium的基础操作 的教程,这篇文章将讲解一些实战内容. 在自动化工作中,有可能会遇到一些发送邮箱验证码类似的功能,如下 我们一般的解决思路就是 : 发送邮件—>打开邮箱—>输入邮箱账户密码—>登录邮箱—>打开未读邮件—>获取验证码—>保存验证码—>读取验证码 以下是一个实现打开网易邮箱读取未读邮件获取验证码的代码 def wangyi(self,username, password, name): dr = webdriv

  • Python实现模拟登录网易邮箱的方法示例

    本文实例讲述了Python实现模拟登录网易邮箱的方法.分享给大家供大家参考,具体如下: #coding:utf-8 import urllib2,urllib import cookielib from bs4 import BeautifulSoup #设置代理IP proxy_support = urllib2.ProxyHandler({'http':'120.197.234.164:80'}) #设置cookie cookie_support = urllib2.HTTPCookiePr

  • python selenium UI自动化解决验证码的4种方法

    本文介绍了python selenium UI自动化解决验证码的4种方法,分享给大家,具体如下: 测试环境 windows7+ firefox50+ geckodriver # firefox浏览器驱动 python3 selenium3 selenium UI自动化解决验证码的4种方法:去掉验证码.设置万能码.验证码识别技术-tesseract.添加cookie登录,本次主要讲解验证码识别技术-tesseract和添加cookie登录. 1. 去掉验证码 去掉验证码,直接通过用户名和密码登陆网

  • Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录

    本文介绍了Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录,分享给大家,具体如下: Python 2.7 IDE Pycharm 5.0.3 Firefox浏览器:47.0.1 Selenium PIL Pytesser Tesseract 扯淡 ​ 我相信每个脚本都有自己的故事,我这个脚本来源于自己GRD教务系统,每次进行登录时,即使我输入全部正确,第一次登录一定是登不上去的!我不知道设计人员什么想法?难道是为了反爬机制?你以为一次登不上,我tm就不爬了?我

  • Python+selenium实现自动循环扔QQ邮箱漂流瓶

    本文实例为大家分享了Python自动循环扔QQ邮箱漂流瓶的具体代码,供大家参考,具体内容如下 Python代码如下: # coding=utf-8 from selenium import webdriver from time import sleep from random import randint def auto_throw(): """扔瓶子""" driver = webdriver.Chrome() driver.get(&qu

  • Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能

    测试结果: 整个买票流程可以再快一点,不过为了稳定起见,有些地方等待了一些时间 完整程序,拿去可用 整个程序分了三个模块:购票模块(主体).验证码识别模块.余票查询模块 购票模块: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.commo

  • Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框

    1.随机生成格式正确手机号码 # 随机产生格式正确的手机号码 def create_phone(self): num_start = ['134', '135', '136', '137', '138', '139', '150', '151', '152', '158', '159', '157', '182', '187', '188', '147', '130', '131', '132', '155', '156', '185', '186', '133', '153', '180',

随机推荐