首頁 > 軟體

Python+Selenium實現讀取網易郵箱驗證碼

2022-03-11 19:01:37

前面寫到了一些關於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其它相關文章!


IT145.com E-mail:sddin#qq.com