51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 778|回复: 0
打印 上一主题 下一主题

[转贴] python + Selenium 自动化实现读取网易邮箱验证码

[复制链接]
  • TA的每日心情
    擦汗
    昨天 09:05
  • 签到天数: 1048 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-6-6 09:37:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在自动化工作中,有可能会遇到一些发送邮箱验证码类似的功能,如下:

    我们一般的解决思路就是 :
      发送邮件—>打开邮箱—>输入邮箱账户密码—>登录邮箱—>打开未读邮件—>获取验证码—>保存验证码—>读取验证码
      以下是一个实现打开网易邮箱读取未读邮件获取验证码的代码:

    1.   def wangyi(self,username, password, name):
    2.           dr = webdriver.Edge()  # 打开另一个浏览器
    3.           dr.maximize_window()  # 窗口最大化
    4.           dr.get("https://mail.163.com/")  # 打开QQ邮箱
    5.           time.sleep(2)
    6.           iframe = dr.find_element(by="xpath",
    7.                                        value="/html/body/div[2]/div[3]/div[1]/div/div[4]/div[1]/div[1]/iframe")
    8.           dr.switch_to.frame(iframe)  # 切换至内嵌页面
    9.           time.sleep(0.5)
    10.           dr.find_element(by="name", value="email").clear()  # 清除内容
    11.           time.sleep(0.5)
    12.           dr.find_element(by="name", value="email").send_keys(username)  # 输入账户
    13.           time.sleep(0.5)
    14.           dr.find_element(by="name", value="password").clear()  # 清除内容
    15.           time.sleep(0.5)
    16.           dr.find_element(by="name", value="password").send_keys(password)
    17.           time.sleep(0.5)
    18.           dr.find_element(by="id", value="dologin").click()  # 进入邮箱首页
    19.           dr.switch_to.parent_frame()  # 切回父级页面
    20.           time.sleep(2)
    21.           num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量
    22.           if int(num) > 0:
    23.               print("存在未读邮件")
    24.               dr.find_element(By.ID, "gWel-animMailIcon").click()  # 点击未读邮件
    25.               time.sleep(2)
    26.               count = dr.find_elements(By.CLASS_NAME, "da0")
    27.               print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件
    28.               for i in range(1, len(count)):
    29.                   emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名
    30.                   print(emailname)
    31.                   print(name)
    32.                   if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作
    33.                       dr.find_element(By.CLASS_NAME, 'da0').click()  # 点击邮件查看详情
    34.                       time.sleep(1)
    35.                       iframe = dr.find_element(By.XPATH,
    36.                                                    "/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe")  #
    37.                       # 定位内嵌页面
    38.                       dr.switch_to.frame(iframe)  # 切换到内嵌页面
    39.                       time.sleep(1)
    40.                       res = dr.find_element(By.CLASS_NAME,
    41.                                                 'netease_mail_readhtml.netease_mail_readhtml_webmail').text  # 获取整个邮件信息
    42.                       print(res)
    43.                       dr.switch_to.parent_frame()  # 切回父级界面
    44.                       self.code = re.findall(pattern="\d+", string=res)  # 使用正则表达式获取邮箱验证码
    45.                       print(self.code)
    46.                       break  # 获取完成退出遍历
    47.           else:
    48.               print('不存在未读邮件')  # 如果没有找到则打印没有找到
    49.           # dr.quit()  # 关闭浏览器
    复制代码
    打开邮箱我们会发现,登录这一个小版块是一个内嵌页面,所以一般的定位方法都会定位失败,会报无法点击到该元素,或者找不到该元素的错误,这是我们就会用到dr.switch_to.frame(iframe)   切换至内嵌页面的方法,当我们切换到内嵌页面的时候,就可以对内嵌页面中的元素进行定位操作。但如果操作完成后希望到内嵌页面外进行操作的话,就需要使用 dr.switch_to.parent_frame() 把焦点切回父级界面。


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

    这边是用了text方法去获取角标文本进行判断,当然获取的文本是str 格式的,需要使用INT方法进行转为整型进行判断。
    1. num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量
    2.           if int(num) > 0:
    3.               print("存在未读邮件")
    4.           else:
    5.           print("未收到邮件")
    复制代码
    判断存在未读邮件后,我们点入未读邮件中,去查看未读邮件信息,首先,我们要获取未读邮件文本信息进行遍历比对,点进去可以发现,邮件的属性可以使用Class_name进行匹定位,但是一样的Class_name有邮件数量+1个,研究后发现第一封邮件的定位为第二个,所以使用遍历 for i in range(1, len(count)),从第二个元素开始,len(count)中的count指的是该元素,len(count)返回值为该元素的数量也就是邮件数量+1。


    实现代码:
    1.  count = dr.find_elements(By.CLASS_NAME, "da0")
    2.               print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件
    3.               for i in range(1, len(count)):
    4.                   emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名
    5.                   print(emailname)
    6.                   print(name)
    7.                   if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作
    8.                   print("找到邮件执行下一步")
    9.                   else:
    10.                   print("未找到邮件")
    复制代码
    找到邮件后需要获取文本信息,可以观察到,文本信息还是比较简单的,其中就只有验证码是数字,所以使用简单的正则匹配可以轻松的将数字匹配出来,值得注意的是,文本内容也是一个内嵌页面,所以也需要切换焦点。


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


    因为返回结果是一个列表,所以后续使用是需要使用code[0]取出。
      完整功能代码:
    1.  import re
    2.   import time
    3.   from selenium import webdriver
    4.   from selenium.webdriver.common.by import By
    5.   """
    6.   使用 Selenium 完成 通过验证码修改密码操作--网易邮箱在未读邮件中获取验证码
    7.   change_pwd 方法中:
    8.   password 登录密码
    9.   newpassword 新密码
    10.   url : 网站地址
    11.   wangyi 方法中:
    12.   username:邮箱账户
    13.   password:邮箱密码
    14.   name:你期望匹配的邮件名字
    15.   """
    16.   class Get_Code:
    17.       def change_pwd(self,password,newpassword,url):
    18.           driver = webdriver.Chrome()  # 打开浏览器
    19.           driver.get(url)
    20.           driver.maximize_window()  # 窗口最大化
    21.           time.sleep(0.5)
    22.           driver.find_element(by=By.XPATH, value="/html/body/div/div/div[1]/div/div[2]/div[3]/div[1]").click()  # 点击登录
    23.           time.sleep(1)
    24.           driver.find_element(by=By.ID, value="horizontal_login_userAccount").send_keys("selenium3366@163.com")  # 输入登录账户
    25.           driver.find_element(by=By.ID, value="horizontal_login_password").send_keys(password)  # 输入登录密码
    26.           driver.find_element(by=By.CLASS_NAME, value="atn-btn-orange.ant-btn.ant-btn-lg.ant-btn-block").click()  # 点击登录
    27.           time.sleep(2)
    28.           driver.find_element(by=By.XPATH,
    29.                               value="""//*[@id="app"]/div/div[1]/div/div[2]/div[3]/div[1]""").click()  # 点击头像进入个人中心
    30.           time.sleep(2)
    31.           driver.find_element(by=By.XPATH,
    32.                               value="""//*[@id="app"]/div/div[2]/div[1]/div[2]/div[3]""").click()  # 点击change_password
    33.           time.sleep(1)
    34.           driver.find_element(by=By.XPATH, value="""//*[@id="horizontal_login_newPassword"]""").send_keys(
    35.               newpassword)  # 输入新密码
    36.           driver.find_element(by=By.XPATH,
    37.                               value="""//*[@id="app"]/div/div/div[2]/form/div[2]/div/div/span/div/div[2]/a""").click()  # 点击发送验证码
    38.           time.sleep(8)  # 等待验证码发送到该邮箱
    39.           self.wangyi(username="selenium3366", password="*******, name="okmarket账户信息更改")  # 调用方法获取验证码
    40.           driver.find_element(by=By.XPATH, value=
    41.           "/html/body/div[1]/div/div/div[2]/form/div[2]/div/div/span/div/div[1]/input").send_keys(
    42.               self.code[0])  # 输入验证码
    43.           time.sleep(0.5)
    44.           driver.find_element(by=By.XPATH, value=
    45.           """/html/body/div[1]/div/div/div[2]/form/div[3]/div/div/span/button""").click()  # 点击按钮
    46.           time.sleep(1)
    47.           text = driver.find_element(by=By.XPATH, value="""/html/body/div[2]/span/div/div/div/span""").text
    48.           print(text)
    49.           try:
    50.               assert text == "password update success"        #断言
    51.               print("修改密码成功")
    52.           except:
    53.               print("修改失败")
    54.       def wangyi(self,username, password, name):
    55.           dr = webdriver.Edge()  # 打开另一个浏览器
    56.           dr.maximize_window()  # 窗口最大化
    57.           dr.get("https://mail.163.com/")  # 打开QQ邮箱
    58.           time.sleep(2)
    59.           iframe = dr.find_element(by="xpath",
    60.                                        value="/html/body/div[2]/div[3]/div[1]/div/div[4]/div[1]/div[1]/iframe")
    61.           dr.switch_to.frame(iframe)  # 切换至内嵌页面
    62.           time.sleep(0.5)
    63.           dr.find_element(by="name", value="email").clear()  # 清除内容
    64.           time.sleep(0.5)
    65.           dr.find_element(by="name", value="email").send_keys(username)  # 输入账户
    66.           time.sleep(0.5)
    67.           dr.find_element(by="name", value="password").clear()  # 清除内容
    68.           time.sleep(0.5)
    69.           dr.find_element(by="name", value="password").send_keys(password)
    70.           time.sleep(0.5)
    71.           dr.find_element(by="id", value="dologin").click()  # 进入邮箱首页
    72.           dr.switch_to.parent_frame()  # 切回父级页面
    73.           time.sleep(2)
    74.           num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text  # 获取未读邮件数量
    75.           if int(num) > 0:
    76.               print("存在未读邮件")
    77.               dr.find_element(By.ID, "gWel-animMailIcon").click()  # 点击未读邮件
    78.               time.sleep(2)
    79.               count = dr.find_elements(By.CLASS_NAME, "da0")
    80.               print(len(count))  # 获取存在的未读邮件数量        从第三个da0开始为未读邮件
    81.               for i in range(1, len(count)):
    82.                   emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text  # 遍历未读邮件邮件名
    83.                   print(emailname)
    84.                   print(name)
    85.                   if emailname == name:  # 如果信息名为想匹配的账户名称则执行下一步操作
    86.                       dr.find_element(By.CLASS_NAME, 'da0').click()  # 点击邮件查看详情
    87.                       time.sleep(1)
    88.                       iframe = dr.find_element(By.XPATH,
    89.                                                    "/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe")  #
    90.                       # 定位内嵌页面
    91.                       dr.switch_to.frame(iframe)  # 切换到内嵌页面
    92.                       time.sleep(1)
    93.                       res = dr.find_element(By.CLASS_NAME,
    94.                                                 'netease_mail_readhtml.netease_mail_readhtml_webmail').text  # 获取整个邮件信息
    95.                       print(res)
    96.                       dr.switch_to.parent_frame()  # 切回父级界面
    97.                       self.code = re.findall(pattern="\d+", string=res)  # 使用正则表达式获取邮箱验证码
    98.                       print(self.code)
    99.                       break  # 获取完成退出遍历
    100.           else:
    101.               print('不存在未读邮件')  # 如果没有找到则打印没有找到
    102.           # dr.quit()  # 关闭浏览器
    103.   if __name__ == '__main__':
    104.       a = Get_Code()
    105.       a.change_pwd(password="a123456",newpassword="a1234567",url="*******")
    复制代码
    完整效果演示:



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-19 05:50 , Processed in 0.072378 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表