Python和Pytest實現登錄態的Cookie繞過方法詳解

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可能會根據用戶登錄狀態、操作行爲等動態變化,需要在測試中進行相應的處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章