1. 背景介紹
京東作爲中國最大的綜合性電商平臺之一,擁有龐大的用戶羣體和海量的商品信息。對於開發人員和測試人員來說,如何高效地進行京東網站的數據爬取和接口測試至關重要。而在進行這些操作時,登錄狀態是一個不可或缺的環節。本文將介紹如何利用Pytest測試框架,通過模擬用戶登錄並繞過登錄驗證,實現保持用戶狀態的技巧。
2. Cookie工作原理
在介紹如何利用Cookie繞過登錄之前,我們先來了解一下Cookie的工作原理。Cookie是服務器發送給瀏覽器的一小段數據,存儲在用戶的計算機上。當用戶訪問網站時,瀏覽器會將Cookie發送回服務器,從而幫助服務器識別用戶身份並保持用戶的登錄狀態。
3. Pytest接口自動化測試實現步驟
3.1 準備工作
首先,我們需要安裝好Pytest庫,並準備好接口自動化測試所需的測試代碼和測試數據。
3.2 獲取登錄狀態的Cookie
在進行京東網站的接口自動化測試之前,首先需要手動進行一次登錄操作,並通過瀏覽器開發者工具或其他方式獲取到登錄成功後的Cookie信息。
3.3 在測試代碼中加入Cookie
在編寫接口自動化測試的代碼時,將獲取到的Cookie信息加入到請求頭中,以模擬用戶登錄狀態。
4.實現Cookie繞過的步驟
接下來,我們將詳細介紹如何使用Python和Pytest實現Cookie繞過,並以爬取京東網站爲例進行說明。
1. 獲取登錄態Cookie
首先,我們需要獲取登錄態的Cookie。我們可以使用Selenium模擬登錄京東網站,並從瀏覽器中獲取登錄後的Cookie信息。
from selenium import webdriver
import random
# 設置代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"
# 隨機生成UA
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
]
# 隨機選擇一個UA
user_agent = random.choice(user_agents)
# 設置Chrome選項
options = webdriver.ChromeOptions()
# 設置UA
options.add_argument(f'user-agent={user_agent}')
# 設置代理
options.add_argument(f'--proxy-server=http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}')
# 啓動瀏覽器
driver = webdriver.Chrome(options=options)
# 打開京東登錄頁面
driver.get('https://passport.jd.com/new/login.aspx')
# 輸入賬號密碼並登錄
driver.find_element_by_id('loginname').send_keys('your_username')
driver.find_element_by_id('nloginpwd').send_keys('your_password')
driver.find_element_by_id('loginsubmit').click()
# 獲取登錄後的Cookie
cookies = driver.get_cookies()
# 關閉瀏覽器
driver.quit()
# 將Cookie轉換成字典形式
cookie_dict = {cookie['name']: cookie['value'] for cookie in cookies}
2. 使用Pytest進行測試
接下來,我們將使用Pytest編寫測試用例,並在測試過程中使用已獲取的登錄態Cookie。
import pytest
import requests
@pytest.fixture(scope='session')
def login_cookie():
return cookie_dict
def test_crawl_jd_data(login_cookie):
url = 'https://www.jd.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
response = requests.get(url, headers=headers, cookies=login_cookie)
assert response.status_code == 200
assert '京東' in response.text
在上述代碼中,我們定義了一個login_cookie的fixture,用於獲取登錄態Cookie。然後,我們編寫了一個測試用例test_crawl_jd_data,在該測試用例中,我們發送了一個帶有登錄態Cookie的請求,並斷言返回狀態碼爲200,並且響應中包含了“京東”關鍵字。
3. 運行測試
最後,我們可以使用Pytest運行測試。
$ pytest test_jd_crawler.py
5. 注意事項
在使用Cookie繞過登錄的過程中,需要注意以下幾點:
- Cookie的安全性:登錄狀態的Cookie包含了用戶的身份信息,需要妥善保管,避免泄露給其他人。
- Cookie的有效期:京東網站的Cookie可能會有有效期限制,需要定期更新或重新獲取。
- 動態變化的Cookie:京東網站的Cookie可能會根據用戶登錄狀態、操作行爲等動態變化,需要在測試中進行相應的處理。