Python3使用Selenium獲取session和token方法詳解
一、背景說明
之前寫了一款簡(jiǎn)單的api模糊測(cè)試工具,之前系統(tǒng)可以使用http Base認(rèn)證現(xiàn)在改成session形式并加上了token。
最簡(jiǎn)單的改造方法,是自己先在瀏覽器手動(dòng)登錄,然后提取出session和token(系統(tǒng)token在整個(gè)會(huì)話期間可重復(fù)使用)填到模糊測(cè)試工具中即可。但這種非全自動(dòng)化的方式不到萬不得已不想用。
最直接的方法,最使用requests按登錄流程依次發(fā)包登錄即可。但其中的難點(diǎn)是密碼是加密提交的,詢問開發(fā)人員說是DES加密;DES加密不難,但是用不同的語言編寫的加密算法與別人的結(jié)果完全一致那就比較費(fèi)工夫。
最后的方法,那就是使用selenium登錄避開密碼的構(gòu)造,這種方法的關(guān)鍵點(diǎn)在于:selenium是基于圖形界面操作的,沒有直接的辦法能獲取request和response的數(shù)據(jù)包,在這種情況下如何獲取session和token。
自己動(dòng)web前端的存儲(chǔ)并沒有很深入了解,一直想的是如何獲取selenium request和response的數(shù)據(jù)包從中提取session和token,直到看到這篇文章才想起前端的變量(尤其是restful中的全局變量)會(huì)放存localStorage和sessionStorage中,從中提取session和token即可。
二、環(huán)境搭建
2.1 下載驅(qū)動(dòng)
下載驅(qū)動(dòng)文件,放到后續(xù)python文件同級(jí)目錄下或加入到環(huán)境變量中即可。其中Chrome驅(qū)動(dòng)要注意Driver版本與瀏覽器版本對(duì)應(yīng)要求。
Firefox驅(qū)動(dòng)下載地址:https://github.com/mozilla/geckodriver/releases
Chrome驅(qū)動(dòng)下載地址:http://chromedriver.chromium.org/downloads
Safari驅(qū)動(dòng)下載地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
Edge驅(qū)動(dòng)下載地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
2.2 安裝selenium
pip install selenium
三、程序?qū)崿F(xiàn)
3.1 系統(tǒng)狀況
手動(dòng)登錄系統(tǒng)后,查看存儲(chǔ)狀況如下圖所示,sessionid和token分別存儲(chǔ)在sessionStorage的sessionId和token兩個(gè)變量中
3.2 實(shí)現(xiàn)代碼
import json import time from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By class GetSessionAndToken(): def __init__(self): # 啟用無頭模式,可選 browser_options = webdriver.FirefoxOptions() browser_options.add_argument('--headless') browser_options.add_argument('--disable-gpu') self.browser = webdriver.Firefox(firefox_options=browser_options) # self.browser = webdriver.Chrome() # 登錄系統(tǒng),具體到自己系統(tǒng)時(shí)需要自行修改 def login_system(self): # 登錄用戶名密碼,改成目標(biāo)系統(tǒng)用戶名密碼 username = "admin" password = "123456" # 登錄頁面url,改成目標(biāo)系統(tǒng)登錄頁面 url = "https://10.10.6.93/#login" self.browser.get(url) # 顯性等待,直到用戶名控件加載出來才進(jìn)行下一步 WebDriverWait(self.browser,20,0.5).until(EC.presence_of_element_located((By.ID,"txtUserName"))) # 填寫用戶名 self.browser.find_element_by_id("txtUserName").send_keys(username) # 填寫密碼 self.browser.find_element_by_id("txtPassword").send_keys(password) # 點(diǎn)擊登錄 self.browser.find_element_by_id("btnLogin").click() # 強(qiáng)制等待5秒,待session和token都成功返回并存到瀏覽器中 # restful隱性等待不太好用?self.browser.implicitly_wait(5) time.sleep(5) # 獲取sessionid def get_sessionid(self): # 是要從localStorage中獲取還是要從sessionStorage中獲取,具體看目標(biāo)系統(tǒng)存到哪個(gè)中 # window.sessionStorage和直接寫sessionStorage是等效的 # 一定要使用return,不然獲取到的一直是None # get的Item不一定就叫sessionId,得具體看目標(biāo)系統(tǒng)把sessionid存到哪個(gè)變量中 sessionid = self.browser.execute_script('return sessionStorage.getItem("sessionId");') # 另外sessionid一般都直接通過返回Set-Cookies頭設(shè)置到Cookie中,所以也可以從Cookie讀取 # 獲取瀏覽器所有Set-Cookie,返回對(duì)象是字典列表 # cookies = self.browser.get_cookies() # 獲取單項(xiàng)Cookie,是不是叫sessionId取決于系統(tǒng)存成什么變量,單項(xiàng)Cookie是字典 # cookie = self.browser.get_cookie("sessionId") # cookie = cookie["value"] # print(f"{cookies}") return sessionid # 獲取token def get_token(self): # 是要從localStorage中獲取還是要從sessionStorage中獲取,具體看目標(biāo)系統(tǒng)存到哪個(gè)中 # window.sessionStorage和直接寫sessionStorage是等效的 # 一定要使用return,不然獲取到的一直是None # get的Item不一定就叫token,得具體看目標(biāo)系統(tǒng)把token存到哪個(gè)變量中 token = self.browser.execute_script('return sessionStorage.getItem("token");') # print(f"{token}") return token def __del__(self): # 退出程序時(shí)關(guān)閉瀏覽器 self.browser.close() if __name__ == "__main__": obj = GetSessionAndToken() obj.login_system() sessionid = obj.get_sessionid() token = obj.get_token() print(f"sessionid為: {sessionid}\n" f"token為: {token}")
3.3 實(shí)現(xiàn)效果
更多關(guān)于Python獲取session和token方法請(qǐng)查看下面的相關(guān)鏈接
- Python使用Selenium WebDriver的入門介紹及安裝教程(最新推薦)
- 新版selenium4.0 + Python使用詳解
- python使用selenium打開chrome瀏覽器時(shí)帶用戶登錄信息實(shí)現(xiàn)過程詳解
- Python編程使用Selenium模擬淘寶登錄實(shí)現(xiàn)過程
- python編程使用selenium編寫測(cè)試用例
- Python使用Selenium自動(dòng)進(jìn)行百度搜索的實(shí)現(xiàn)
- Python Selenium庫(kù)的基本使用教程
- Python中Selenium庫(kù)使用教程詳解
- Python中Selenium的基本使用步驟
相關(guān)文章
Python中對(duì)元組和列表按條件進(jìn)行排序的方法示例
這篇文章主要介紹了Python中對(duì)元組和列表按條件進(jìn)行排序的方法示例,需要的朋友可以參考下2015-11-11pandas常用表連接merge/concat/join/append詳解
使用python的pandas庫(kù)可以很容易幫你搞定,而且性能也是很出色的;百萬級(jí)的表關(guān)聯(lián),可以秒出,本文給大家分享pandas常用表連接merge/concat/join/append詳解,感興趣的朋友跟隨小編一起看看吧2023-02-02python3中pip3安裝出錯(cuò),找不到SSL的解決方式
今天小編就為大家分享一篇python3中pip3安裝出錯(cuò),找不到SSL的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12Pytorch搭建YoloV5目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)過程
這篇文章主要為大家介紹了Pytorch搭建YoloV5目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04使用Python實(shí)現(xiàn)一個(gè)蔡徐坤大戰(zhàn)籃球的小游戲(推薦)
這篇文章主要介紹了用Python實(shí)現(xiàn)一個(gè)蔡徐坤大戰(zhàn)籃球的小游戲,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12使用Python程序抓取新浪在國(guó)內(nèi)的所有IP的教程
這篇文章主要介紹了使用Python程序抓取新浪在國(guó)內(nèi)的所有IP的教程,作為Python網(wǎng)絡(luò)編程中獲取IP的一個(gè)小實(shí)踐,需要的朋友可以參考下2015-05-05Python操控mysql批量插入數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了Python操控mysql批量插入數(shù)據(jù)的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Python中創(chuàng)建相關(guān)系數(shù)矩陣的方法小結(jié)
相關(guān)系數(shù)矩陣是一種用于衡量變量之間關(guān)系的重要工具,本文將介紹在 Python 中創(chuàng)建相關(guān)系數(shù)矩陣的不同方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12