【心善淵&Selenium3.0基礎】— 22、Selenium實現通過cookie繞過驗證碼登陸

1、驗證碼問題

對於web 應用來說,大部分的系統在用戶登錄時,都要求用戶輸入驗證碼。驗證碼的類型的很多,有字母數字的,有漢字的,甚至還要用戶輸入一條算術題的答案的。對於系統來說,使用驗證碼可以有效果的防止採用機器猜測方法對口令的刺探,在一定程度上增加了安全性。但對於測試人員來說,不管是進行性能測試,還是自動化測試都是一個棘手的問題。

2、處理驗證碼的方法

(1)去掉驗證碼

這是最簡單的方法,對於開發人員來說,只是把驗證碼的相關代碼註釋掉即可,如果是在測試環境,這樣做可省去了測試人員不少麻煩,如果自動化腳本是要在正式環境跑,這樣就給系統帶來了一定的風險。(風險大)

(2)設置萬能碼

去掉驗證碼的主要是安全問題,爲了應對在線系統的安全性威脅,可以在修改程序時不取消驗證碼,而是程序中留一個“後門”,設置一個“萬能驗證碼”,只要用戶輸入這個“萬能驗證碼”,程序就認爲驗證通過,否則按照原先的驗證方式進行驗證。

(3)驗證碼識別技術

例如可以通過Python-tesseract來識別圖片驗證碼,Python-tesseract 是光學字符識別Tesseract CR引擎的Python 封裝類。能夠讀取任何常規的圖片文件(JPG, GIF ,PNG , TIFF 等)。不過,目前市面上的驗證碼形式繁多,目前任何一種驗證碼識別技術,識別率都不是100% 。(玩玩還行,工作中不推薦)

(4)記錄cookie

通過向瀏覽器中添加cookie 可以繞過登錄的驗證碼,這是比較有意思的一種解決方案。我們可以在用戶登錄之前,通過add_cookie()方法將用戶名密碼寫入瀏覽器cookie ,再次訪問系統登錄鏈接將自動登錄。

3、Selenium實現通過cookie繞過驗證碼登陸

"""
1.學習目標
    掌握驗證碼處理方式
2.操作步驟
    2.1 獲取登錄後的cookie
        通過瀏覽器F12或抓包工具
    2.2 將登錄後的cookie添加到腳本中
        driver.add_cookie(字典格式)
    2.3 執行刷新操作
        driver.refresh()
3.需求
    獲取百度登錄後的cookie,實現免登陸
4.總結
    4.1 首先登錄一次
    4.2 明確哪些cookie和登錄相關
        (1)如果明確哪些cookie是保存用戶信息,添加相應的cookie就好
        (2)如果不知道哪些cookie是保存用戶信息的
            @1 可以把登陸後的cookie全部添加進去。
            @2也可以登陸前和登陸後分別獲取cookie,
            登陸後多出來的cookie就是和登陸相關的用戶信息cookie。
    4.3 使用cookie做免登陸,原來登錄的賬號不能退出的
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器
driver = webdriver.Chrome()

# 3.打開頁面
url = "http://www.baidu.com/"
driver.get(url)
sleep(2)

"""
4. 登陸一次百度網站
    通過瀏覽器F12或抓包工具,獲取cookie,
    火狐瀏覽器方便獲取
"""

"""
5. 添加百度登錄後的cookie  
    要確定哪些cookie是和用戶信息先關的。
    百度中BAIDUID和BDUSS兩個cookie是和用戶信息相關的。
    這兩個cookie就可以實現百度免登錄。
    
    測公司自己項目的時候,需要用cookie實現免登錄,
    需要問一下開發,和用戶個人信息相關的登陸數據是哪些cookie。
    加載這些條cookie信息就可以實現免登錄。
"""
cookies = [{"name": "BAIDUID", "value": "026CB67282F2B6C4F2AC6880EAEFE5A6:FG=1"},
           {"name": "BDUSS",
            "value": "pJckQ3aXdEVi1ZaUVpalpDfjhmQTlpZW9mfnNCMUFCdDFCNUpZajB3TG5sdlJlRVFBQUFBJCQAAAAAAAAAAAEAAAAzO-pLc2RqYWtzZGs3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOcJzV7nCc1eYX"}]

# 6. 遍歷cookies列表,添加cookie
for cookie in cookies:
    driver.add_cookie(cookie)

# 7. 刷新頁面
driver.refresh()
sleep(3)

# 8.關閉瀏覽器
driver.quit()

"""
注意:
當你手動點擊退出登陸,你所加載這這些cookie就失效了。
如果還需要通過cookie實現免登錄,就要重新獲取cookie信息。
"""

4、總結

  • 通過上面例子我們可以知道,查看訪問百度所獲得的cookie中,也沒有看到有“sessionID”的數據,所以說“sessionID”名字是其他的名字也是一樣的,後端拿到這些cookie之後,只需要知道這個數據就是session,然後拿去和數據庫裏的進行比對就行了。

  • 使用cookie 進行登錄最大的難點是如何獲得用戶名密碼的name ,如果找到不到name 的名字,就沒辦法向value 中輸用戶名、密碼信息。可以通過get_cookies()方法來獲取登錄的所有的cookie 信息,從而進行找到用戶名、密碼的name 對象的名字。當然最簡單的方法還是詢問前端開發人員。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章