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-識別驗證碼,我會用這個標題,可能就搜出我寫的了。