網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前面寫(xiě)到了一些關(guān)于python+Selenium的基礎(chǔ)操作 的教程,這篇文章將講解一些實(shí)戰(zhàn)內(nèi)容。
在自動(dòng)化工作中,有可能會(huì)遇到一些發(fā)送郵箱驗(yàn)證碼類似的功能,如下
我們一般的解決思路就是 :
發(fā)送郵件—>打開(kāi)郵箱—>輸入郵箱賬戶密碼—>登錄郵箱—>打開(kāi)未讀郵件—>獲取驗(yàn)證碼—>保存驗(yàn)證碼—>讀取驗(yàn)證碼
以下是一個(gè)實(shí)現(xiàn)打開(kāi)網(wǎng)易郵箱讀取未讀郵件獲取驗(yàn)證碼的代碼
def wangyi(self,username, password, name): dr = webdriver.Edge() # 打開(kāi)另一個(gè)瀏覽器 dr.maximize_window() # 窗口最大化 dr.get("https://mail.163.com/") # 打開(kāi)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) # 切換至內(nèi)嵌頁(yè)面 time.sleep(0.5) dr.find_element(by="name", value="email").clear() # 清除內(nèi)容 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() # 清除內(nèi)容 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() # 進(jìn)入郵箱首頁(yè) dr.switch_to.parent_frame() # 切回父級(jí)頁(yè)面 time.sleep(2) num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text # 獲取未讀郵件數(shù)量 if int(num) > 0: print("存在未讀郵件") dr.find_element(By.ID, "gWel-animMailIcon").click() # 點(diǎn)擊未讀郵件 time.sleep(2) count = dr.find_elements(By.CLASS_NAME, "da0") print(len(count)) # 獲取存在的未讀郵件數(shù)量 從第三個(gè)da0開(kāi)始為未讀郵件 for i in range(1, len(count)): emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text # 遍歷未讀郵件郵件名 print(emailname) print(name) if emailname == name: # 如果信息名為想匹配的賬戶名稱則執(zhí)行下一步操作 dr.find_element(By.CLASS_NAME, 'da0').click() # 點(diǎn)擊郵件查看詳情 time.sleep(1) iframe = dr.find_element(By.XPATH, "/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe") # # 定位內(nèi)嵌頁(yè)面 dr.switch_to.frame(iframe) # 切換到內(nèi)嵌頁(yè)面 time.sleep(1) res = dr.find_element(By.CLASS_NAME, 'netease_mail_readhtml.netease_mail_readhtml_webmail').text # 獲取整個(gè)郵件信息 print(res) dr.switch_to.parent_frame() # 切回父級(jí)界面 self.code = re.findall(pattern="\d+", string=res) # 使用正則表達(dá)式獲取郵箱驗(yàn)證碼 print(self.code) break # 獲取完成退出遍歷 else: print('不存在未讀郵件') # 如果沒(méi)有找到則打印沒(méi)有找到 # dr.quit() # 關(guān)閉瀏覽器
打開(kāi)郵箱我們會(huì)發(fā)現(xiàn),登錄這一個(gè)小版塊是一個(gè)內(nèi)嵌頁(yè)面,所以一般的定位方法都會(huì)定位失敗,會(huì)報(bào)無(wú)法點(diǎn)擊到該元素,或者找不到該元素的錯(cuò)誤,這是我們就會(huì)用到dr.switch_to.frame(iframe) 切換至內(nèi)嵌頁(yè)面的方法,當(dāng)我們切換到內(nèi)嵌頁(yè)面的時(shí)候,就可以對(duì)內(nèi)嵌頁(yè)面中的元素進(jìn)行定位操作。但如果操作完成后希望到內(nèi)嵌頁(yè)面外進(jìn)行操作的話,就需要使用dr.switch_to.parent_frame() 把焦點(diǎn)切回父級(jí)界面。
進(jìn)入郵箱后,首先要判斷是否收到了郵件,所以通過(guò)未讀郵件右上角的角標(biāo)來(lái)判斷是否收到了郵件,如果收到了才進(jìn)行下一步操作,如果沒(méi)有收到則提示沒(méi)有收到郵件,當(dāng)然也可以優(yōu)化一下,設(shè)置一個(gè)循環(huán),定時(shí)多久查看一次,超過(guò)多少時(shí)間則報(bào)錯(cuò)。
這邊是用了text方法去獲取角標(biāo)文本進(jìn)行判斷,當(dāng)然獲取的文本是str 格式的,需要使用INT方法進(jìn)行轉(zhuǎn)為整型進(jìn)行判斷
num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text # 獲取未讀郵件數(shù)量 if int(num) > 0: print("存在未讀郵件") else: print("未收到郵件")
判斷存在未讀郵件后,我們點(diǎn)入未讀郵件中,去查看未讀郵件信息,首先,我們要獲取未讀郵件文本信息進(jìn)行遍歷比對(duì),點(diǎn)進(jìn)去可以發(fā)現(xiàn),郵件的屬性可以使用Class_name進(jìn)行匹定位,但是一樣的Class_name有郵件數(shù)量+1個(gè),研究后發(fā)現(xiàn)第一封郵件的定位為第二個(gè),所以使用遍歷 for i in range(1, len(count)),從第二個(gè)元素開(kāi)始,len(count)中的count指的是該元素,len(count)返回值為該元素的數(shù)量也就是郵件數(shù)量+1,
實(shí)現(xiàn)代碼:
count = dr.find_elements(By.CLASS_NAME, "da0") print(len(count)) # 獲取存在的未讀郵件數(shù)量 從第三個(gè)da0開(kāi)始為未讀郵件 for i in range(1, len(count)): emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text # 遍歷未讀郵件郵件名 print(emailname) print(name) if emailname == name: # 如果信息名為想匹配的賬戶名稱則執(zhí)行下一步操作 print("找到郵件執(zhí)行下一步") else: print("未找到郵件")
找到郵件后需要獲取文本信息,可以觀察到,文本信息還是比較簡(jiǎn)單的,其中就只有驗(yàn)證碼是數(shù)字,所以使用簡(jiǎn)單的正則匹配可以輕松的將數(shù)字匹配出來(lái),值得注意的是,文本內(nèi)容也是一個(gè)內(nèi)嵌頁(yè)面,所以也需要切換焦點(diǎn)
具體實(shí)現(xiàn)代碼:
dr.find_element(By.CLASS_NAME, 'da0').click() # 點(diǎn)擊郵件查看詳情 time.sleep(1) iframe = dr.find_element(By.XPATH,"/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe") # 定位內(nèi)嵌頁(yè)面 dr.switch_to.frame(iframe) # 切換到內(nèi)嵌頁(yè)面 time.sleep(1) res = dr.find_element(By.CLASS_NAME, 'netease_mail_readhtml.netease_mail_readhtml_webmail').text # 獲取整個(gè)郵件信息 print(res) dr.switch_to.parent_frame() # 切回父級(jí)界面 self.code = re.findall(pattern="\d+", string=res) # 使用正則表達(dá)式獲取郵箱驗(yàn)證碼
返回結(jié)果:
因?yàn)榉祷亟Y(jié)果是一個(gè)列表,所以后續(xù)使用是需要使用code[0]取出
完整功能代碼:
import re import time from selenium import webdriver from selenium.webdriver.common.by import By """ 使用 Selenium 完成 通過(guò)驗(yàn)證碼修改密碼操作--網(wǎng)易郵箱在未讀郵件中獲取驗(yàn)證碼 change_pwd 方法中: password 登錄密碼 newpassword 新密碼 url : 網(wǎng)站地址 wangyi 方法中: username:郵箱賬戶 password:郵箱密碼 name:你期望匹配的郵件名字 """ class Get_Code: def change_pwd(self,password,newpassword,url): driver = webdriver.Chrome() # 打開(kāi)瀏覽器 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() # 點(diǎn)擊登錄 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() # 點(diǎn)擊登錄 time.sleep(2) driver.find_element(by=By.XPATH, value="""http://*[@id="app"]/div/div[1]/div/div[2]/div[3]/div[1]""").click() # 點(diǎn)擊頭像進(jìn)入個(gè)人中心 time.sleep(2) driver.find_element(by=By.XPATH, value="""http://*[@id="app"]/div/div[2]/div[1]/div[2]/div[3]""").click() # 點(diǎn)擊change_password time.sleep(1) driver.find_element(by=By.XPATH, value="""http://*[@id="horizontal_login_newPassword"]""").send_keys( newpassword) # 輸入新密碼 driver.find_element(by=By.XPATH, value="""http://*[@id="app"]/div/div/div[2]/form/div[2]/div/div/span/div/div[2]/a""").click() # 點(diǎn)擊發(fā)送驗(yàn)證碼 time.sleep(8) # 等待驗(yàn)證碼發(fā)送到該郵箱 self.wangyi(username="selenium3366", password="*******, name="okmarket賬戶信息更改") # 調(diào)用方法獲取驗(yàn)證碼 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]) # 輸入驗(yàn)證碼 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() # 點(diǎn)擊按鈕 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() # 打開(kāi)另一個(gè)瀏覽器 dr.maximize_window() # 窗口最大化 dr.get("https://mail.163.com/") # 打開(kāi)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) # 切換至內(nèi)嵌頁(yè)面 time.sleep(0.5) dr.find_element(by="name", value="email").clear() # 清除內(nèi)容 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() # 清除內(nèi)容 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() # 進(jìn)入郵箱首頁(yè) dr.switch_to.parent_frame() # 切回父級(jí)頁(yè)面 time.sleep(2) num = dr.find_element(By.CLASS_NAME, "gWel-mailInfo-status").text # 獲取未讀郵件數(shù)量 if int(num) > 0: print("存在未讀郵件") dr.find_element(By.ID, "gWel-animMailIcon").click() # 點(diǎn)擊未讀郵件 time.sleep(2) count = dr.find_elements(By.CLASS_NAME, "da0") print(len(count)) # 獲取存在的未讀郵件數(shù)量 從第三個(gè)da0開(kāi)始為未讀郵件 for i in range(1, len(count)): emailname = dr.find_elements(By.CLASS_NAME, "da0")[i].text # 遍歷未讀郵件郵件名 print(emailname) print(name) if emailname == name: # 如果信息名為想匹配的賬戶名稱則執(zhí)行下一步操作 dr.find_element(By.CLASS_NAME, 'da0').click() # 點(diǎn)擊郵件查看詳情 time.sleep(1) iframe = dr.find_element(By.XPATH, "/html/body/div[2]/div[1]/div[3]/div/div[1]/div[6]/div/iframe") # # 定位內(nèi)嵌頁(yè)面 dr.switch_to.frame(iframe) # 切換到內(nèi)嵌頁(yè)面 time.sleep(1) res = dr.find_element(By.CLASS_NAME, 'netease_mail_readhtml.netease_mail_readhtml_webmail').text # 獲取整個(gè)郵件信息 print(res) dr.switch_to.parent_frame() # 切回父級(jí)界面 self.code = re.findall(pattern="\d+", string=res) # 使用正則表達(dá)式獲取郵箱驗(yàn)證碼 print(self.code) break # 獲取完成退出遍歷 else: print('不存在未讀郵件') # 如果沒(méi)有找到則打印沒(méi)有找到 # dr.quit() # 關(guān)閉瀏覽器 if __name__ == '__main__': a = Get_Code() a.change_pwd(password="a123456",newpassword="a1234567",url="*******")
完整效果演示:
原文鏈接:https://blog.csdn.net/a883774913/article/details/122375957
相關(guān)推薦
- 2022-06-06 解決http://localhost:3000/favicon.ico 的404 問(wèn)題(含案例解析)
- 2022-09-20 windows?server2008?R2?角色遷移問(wèn)題詳解_win服務(wù)器
- 2022-08-29 .NET?Core自定義配置文件_實(shí)用技巧
- 2023-03-21 C#中寫(xiě)入和讀取TXT文件問(wèn)題_C#教程
- 2022-07-07 Python數(shù)據(jù)分析之?Matplotlib?折線圖繪制_python
- 2022-08-03 python如何實(shí)現(xiàn)排序,并標(biāo)上序號(hào)_python
- 2022-12-05 Linux系統(tǒng)查看服務(wù)器帶寬及網(wǎng)絡(luò)使用情況的具體方法_服務(wù)器其它
- 2022-11-25 Linux?apache實(shí)現(xiàn)https的配置方法_Linux
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支