<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前面寫到了一些關於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讀取郵箱驗證碼的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45