1. 程式人生 > >selenium-跳過登入驗證碼

selenium-跳過登入驗證碼

selenium最常見的就是登入,但是登入有個坑,就是驗證碼的問題,關於驗證碼一共四個辦法:

1.讓開發註釋掉驗證碼。

2.讓開發設定一個萬能驗證碼,只要輸入這個驗證碼,就通過。

3.跳過驗證碼直接登入成功。

4.驗證碼識別技術。

第三條寫的很模糊,不過下面就介紹一下第三條的實現方法。

先說一下實現思路:

1.開啟要測試的網頁,獲取登入前的cookie(可以抓包獲取,可以程式碼實現,下面會附上程式碼)。

2.手動登入,再獲取登入後的cookie。

3.對比兩次獲取的cookie,找出登入後多出來的cookie,只要多出來的name和value就行(一般name就是token)。

4.在程式碼里加上寫入cookie,把找出來的name和value寫入。然後再寫一遍開啟網頁的程式碼。

下面放上程式碼(不要著急複製程式碼為自己所用,程式碼後面會寫限制,有些登入用這程式碼也跳不過去,哈哈)。

#coding=utf-8
from selenium import webdriver
import time
#下面四行這麼寫是去掉谷歌瀏覽器上面提示的,第二行和第三行分別對應不同的提示
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
# options.add_argument('disable-infobars')
browser = webdriver.Chrome(chrome_options=options)
#
browser.maximize_window()
#開啟火狐瀏覽器
# browser=webdriver.Firefox()
#輸入網址
browser.get("https://m.flycua.com/h5/#/")
#點選登入,用下面註釋的程式碼獲取cookie,實現跳過登入,執行指令碼的時候就不用這部分了
# browser.find_element_by_id("su").click()
# cookie1= browser.get_cookies()
#列印登入前的cookie
# print (cookie1)
#等待30秒,用這30秒時間完成登入操作
# time.sleep(30)
#獲取登入後的cookie
# cookie2= browser.get_cookies()
#列印登入後的cookie
# print (cookie2)
#
#加入要獲取的cookie,寫進去
browser.add_cookie({'name':'tokenId', 'value':'8BB8FDD4FBB31F92424A7E0EBE872E01A4AF77654043DAD638E9F93B378F94E19A882A6C7E78999C9A5482985FDA333C3D1E5236C6BDA7935A89178F053FB490'})
#再次輸入網址
browser.get("https://m.flycua.com")

上面程式碼包含了獲取cookie和實現跳過登入的所有程式碼,註釋部分一定要看清楚。(最早寫的是用的python2,後來又拿到python3的環境上執行,根據自己python版本,對指令碼略作修改,應該只有print要修改)

然後我再說一下這程式碼的侷限性。

1.可以看出cookie裡有tokenId,這個tokenId可以使用比較長的一段時間,前提是隻執行這自動化指令碼,不能再手動登入。因為手動登入又會產生一個新的tokenId,程式碼需要更新。

2.如果某些網站開啟直接就是登入頁,那恐怕就跳不過登入了,即使寫入cookie,第二次開啟的網頁,仍然是登入頁,即使寫了登入後的網址。(我還見過更厲害的,登入之前和登入之後網址都不變)

如果不幸要測試的網站中了第二條,那麼只能放棄這中辦法了。驗證碼識別會在後續寫,可以百度搜索:selenium-識別驗證碼,我會用這個標題,可能就搜出我寫的了。