前面写到了一些关于python+Selenium的基础操作 的教程,这篇文章将讲解一些实战内容。
在自动化工作中,有可能会遇到一些发送邮箱验证码类似的功能,如下
我们一般的解决思路就是 :
发送邮件—>打开邮箱—>输入邮箱账户密码—>登录邮箱—>打开未读邮件—>获取验证码—>保存验证码—>读取验证码
以下是一个实现打开网易邮箱读取未读邮件获取验证码的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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方法进行转为整型进行判断
1 2 3 4 5 | 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,
实现代码:
1 2 3 4 5 6 7 8 9 10 | 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 ( "未找到邮件" ) |
找到邮件后需要获取文本信息,可以观察到,文本信息还是比较简单的,其中就只有验证码是数字,所以使用简单的正则匹配可以轻松的将数字匹配出来,值得注意的是,文本内容也是一个内嵌页面,所以也需要切换焦点
具体实现代码:
1 2 3 4 5 6 7 8 9 10 | 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]取出
完整功能代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 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读取邮箱验证码的资料请关注源码搜藏网其它相关文章!
热门源码