前言
在使用httprunner寫接口自動化用例時,遇到有些接口需要用到cookies,如果cookie沒關聯起來的話,會出現403 Forbidden的問題
問題描述
用httprunner寫了個網頁的登錄用例,以下是相關的腳本參考test_cookie_demo.yml
# 作者:上海-悠悠 qq交流群:874033608
- config:
name: test login api demo
variables: {}
request:
base_url: http://49.235.x.x:80xx
- test:
name: 測試用例名稱
request:
headers:
Content-Type: application/x-www-form-urlencoded
data:
csrfmiddlewaretoken: ChMBwCgvH04sOA1XhPkPzUbfKDD5O8lmqAYR0oWIvSH2waMWpnzaxytvj8EUQgCF
username: admin1
password: 1111111*****
method: POST
url: /xadmin/
validate:
- eq:
- status_code
- 200
運行結果
D:\soft\code\demo>hrun test_cookie_demo.yml
測試用例名稱
INFO POST /xadmin/
ERROR 403 Client Error: Forbidden for url: http://49.235.x.x:80xx/xadmin/
INFO start to validate.
ERROR validate: status_code equals 200(int) ==> fail
403(int) equals 200(int)
ERROR request:
headers: {'content-type': 'application/x-www-form-urlencoded'}
json: {'data': 'ChMBwCgvH04sOA1XhPkPzUbfKDD5O8lmqAYR0oWIvSH2waMWpnzaxytvj8EUQgCF', 'username': 'admin', 'password': '11111111***'}
ERROR response:
status_code: 403
運行結果出現:403 Forbidden

cookies關聯
出現403 Forbidden問題,一般是網站處於安全考慮,缺少cookies導致,可以在頁面登錄的時候,用fiddler抓一個登陸成功的包對比下就知道了

那么這個cookies從哪來的呢,一般是瀏覽器打開登錄首頁的時候(還沒輸入賬號和密碼的時候),服務端會返回cookies過來,瀏覽器會記住緩存。
所以解決這個問題就模擬瀏覽器打開登錄頁一樣,先發個get請求訪問登錄首頁,獲取到cookie后再去登錄
httprunner框架繼承了requests庫的優良特征,會自動管理cookie(看到有些同學費盡周折去提取cookies,又去關聯cookies,其實沒必要)
# 作者:上海-悠悠 qq交流群:874033608
- config:
name: test login api demo
variables: {}
request:
base_url: http://49.235.x.x:80xx
- test:
name: 先訪GET問登錄首頁,獲取cookies
request:
method: GET
url: /xadmin/
extract:
- csrfmiddlewaretoken: name='csrfmiddlewaretoken' value='(.+?)' # 頁面正則提取隱藏參數csrfmiddlewaretoken
validate:
- eq:
- status_code
- 200
- test:
name: 登錄用例
request:
headers:
Content-Type: application/x-www-form-urlencoded
data:
csrfmiddlewaretoken: $csrfmiddlewaretoken
username: admin1
password: 1111111*****
this_is_the_login_form: "1"
next: /xadmin/
method: POST
url: /xadmin/
validate:
- eq:
- status_code
- 200
運行結果
D:\soft\code\demo>hrun test_cookie_demo.yml
先訪GET問登錄首頁,獲取cookies
INFO GET /xadmin/
INFO status_code: 200, response_time(ms): 34.57 ms, response_length: 4163 bytes
INFO start to extract from response object.
INFO start to validate.
.
登錄用例
INFO POST /xadmin/
INFO status_code: 200, response_time(ms): 132.31 ms, response_length: 4400 bytes
INFO start to validate.
.
----------------------------------------------------------------------
Ran 2 tests in 0.181s
OK
INFO Start to render Html report ...
INFO Generated Html report: D:\soft\code\demo\reports\2020_02_21 23_21_19.html
使用fiddler抓包查看,會發現cookie已經關聯成功了

隱藏參數csrfmiddlewaretoken
csrfmiddlewaretoken參數是html頁面上的隱藏參數,這個在django系列教程里面提到過,是為了防止跨域偽造請求。
每次刷新頁面都會自動變的,所以需要先把此參數提取出來,動態關聯到請求參數的body里面去

