在使用selenium測試后台時常常每個流程都需要走登錄流程,這樣自然比較浪費時間。如果遇到登錄需要輸入驗證碼等情況,就可能出師未捷身先死。
在Web應用中,登錄狀態通常是通過Cookie中對應的session id驗證的。也是就是說,我們只要攜帶上登錄后的Cookies,瀏覽器就會自動識別我們為登錄狀態。由於Selenium每次啟動的瀏覽器是一個隔離的環境,不能直接使用本地已經保存的Cookies值,我們需要通過driver的add_cookie()
方法手動添加Cookies,來繞過登錄。
手工抓取Cookie並繞過登錄
如圖,先手工登錄后,通過開發者工具-網絡面板,查看任意請求中的Cookie值,經嘗試分析,ECSCP_ID的值為session id,我們只需要添加此條Cookie即可。
Cookie的存儲格式,如下圖所示,每一條包含name,value,path,secure等字段
WebDriver相關的Cookies操作
- get_cookies(self): 獲取當前會話中當前域名所有cookies
- get_cookie(self, name): 獲取當前會話中當前域名指定name對應的cookie值
- delete_cookie(self, name): 刪除指定cookie
- delete_all_cookies(self): 刪除所有cookie
- add_cookie(self, cookie_dict): 添加cookie
添加Cookie時需要逐條添加,cookie_dict示例:
- driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
- driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
- driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})"
示例代碼:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://39.104.14.232/ecshop/wwwroot/admin/privilege.php?act=login')
driver.add_cookie(dict(name='ECSCP_ID',value='7406d5a6f0c5bdfbebcc29b4e41cea9731d9e9f0'))
driver.get('http://39.104.14.232/ecshop/wwwroot/admin/index.php')
sleep(3)
driver.quit()
注意:必須先打開一個頁面(同域名頁面)才能設置cookie,否則會報
UnableToSetCookieException
使用Requests配合Selenium繞過登錄
手工抓取的Cookie有一定的有效期,我們可以通過發送登錄接口,從響應中拿到Cookies再放入Selenium中使用。
示例代碼:
import requests
from selenium import webdriver
from time import sleep
data = dict(username='****', password='****', act='signin')
res = requests.post('http://39.104.14.232/ecshop/wwwroot/admin/privilege.php', data=data, allow_redirects=False)
esscp_id = res.cookies.get('ECSCP_ID')
driver = webdriver.Chrome()
driver.get('http://39.104.14.232/ecshop/wwwroot/admin/privilege.php?act=login')
driver.add_cookie(dict(name='ECSCP_ID',value=esscp_id))
driver.get('http://39.104.14.232/ecshop/wwwroot/admin/index.php')
sleep(3)
driver.quit()
同樣,如果有多條Cookies,需要從請求響應中逐個提取,在Selenium中逐個添加。
用戶名、密碼可微信聯系lockingfree獲取