前言

上一個接口返回的token作為下個接口的入參,除了前面一篇講到的用json提取器提取,也可以用正則提取。
json提取器只能提取json格式的數據,正則可以匹配任意的返回。

我現在有一個登陸接口A,登陸成功後返回一個token值。有一個獲取綁定卡號的接口B,但是接口B必須要先登錄後傳登錄的token才能訪問
A接口登錄接口文檔基本信息

  • 訪問地址:http://127.0.0.1:8000/api/v1/login/
  • 請求類型:POST
  • 請求頭部:application/json
  • 請求參數:{"username":"test", "password":"123456"}

A接口的請求和返回的報文信息如下

D:\>http http://127.0.0.1:8000/api/v1/login/ username=test password=123456 -v
POST /api/v1/login/ HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 42
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/1.0.3

{
    "password": "123456",
    "username": "test"
}

HTTP/1.1 200 OK
Allow: POST, OPTIONS
Content-Length: 109
Content-Type: application/json
Date: Sat, 21 Sep 2019 15:37:06 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

{
    "code": 0,
    "msg": "login success!",
    "token": "234af73571da46ade79ea6a74961b1d23d609b79",
    "username": "test"
}

B接口獲取綁定卡號的接口文檔基本信息

  • 訪問地址:http://127.0.0.1:8000/api/v1/user/info/
  • 請求類型:GET
  • 請求頭部:Content-Type: application/json
  • 請求頭部token參數: Authorization: Token xxxxx login token xxxxx

登錄請求

先在jmeter裏面添加http請求,填登錄接口的參數

jemter提取authorization_正則表達式

HTTP信息頭管理器添加post請求類型:Content-Type: application/json

jemter提取authorization_正則表達式_02

運行之後查看結果數,可以看到正確的返回我們想要的token值

jemter提取authorization_正則表達式_03

正則提取器

添加後置處理器-正則提取器

jemter提取authorization_json_04

返回的結果,從結果中提取token對應的值:50c7e57363141459fab998376350ed3c3dee1baf

{"code": 0, "msg": "login success!", "username": "test", "token": "50c7e57363141459fab998376350ed3c3dee1baf"}

jemter提取authorization_正則_05

正則提取器參數説明:

  • 要檢查的響應字段:樣本數據源,默認選主體。
  • 引用名稱:其他地方引用時的變量名稱(re_token),可自定義設置,引用方法:${引用名稱}
  • 正則表達式:數據提取器,()括號裏為你要獲取的的值,如:"token": "(.*?)"
  • 模板:$$對應正則表達式提取器類型。-1全部,0 隨機,1第一個2第二個,以此類推,若只有一個正則一般就填寫$1$
  • 匹配數字:正則表達式匹配數據的所有結果可以看做一個數組,匹配數字即可看做是數組的第幾個元素。
    -1表示全部,0隨機,1第一個,2第二個,以此類推。若只要獲取到匹配的第一個值,則填寫1
  • 缺省值:匹配失敗時的默認值,可以隨便寫個,不寫也可以,或者勾選失敗時候使用空值

引用參數

下個請求引用上面的token參數

jemter提取authorization_正則表達式_06

查看結果,引用成功

jemter提取authorization_正則_07

 

Xpath提取器

前言

有些web項目是前後端不分離的,返回的內容不是那種純進口返回json格式,返回的是一個HTML頁面。
並且有些參數是隱藏在html裏面的,需要先從html頁面中取出隱藏參數,如:csrfmiddlewaretoken

場景案例

我這裏有個django項目的admin後台頁面為案例

jemter提取authorization_json_08

輸入賬號和密碼登錄成功後,抓包發現除了賬號和密碼參數,還有一個參數csrfmiddlewaretoken,並且這個參數每次都是動態的,不是固定值

jemter提取authorization_正則_09

所以在請求這個login接口的時候,需要先獲取csrfmiddlewaretoken參數,那麼這個參數哪來的呢?

csrfmiddlewaretoken是每次在瀏覽器上打開登錄首頁的時候,會自動生成一個隱藏(hidden)的參數csrfmiddlewaretoken

jemter提取authorization_正則表達式_10

那麼接下來就先把這個值提取出來

獲取csrfmiddlewaretoken

先訪問首頁http://127.0.0.1:9000/admin/

jemter提取authorization_正則表達式_11

保證返回的結果裏面能看到csrfmiddlewaretoken對應的值

jemter提取authorization_正則表達式_12

返回的結果裏面有了這個值後,接下來用 XPath 提取器提取出來

XPath 提取器

後置處理器添加 XPath 提取器

jemter提取authorization_json_13

使用 xpath 表達式提取html頁面數據,先在谷歌瀏覽器上定位調試,保證能正確定位

jemter提取authorization_正則_14

用 XPath 表達式提取

jemter提取authorization_正則表達式_15

XPath 表達式提取參數説明:

  • Use Tidy:當需要處理的頁面是HTML格式時,必須選中該選項,當需要處理的頁面是XML或XHTML格式(例如,RSS返回)時,取消選中該選項。
  • 引用名稱:參數的變量名稱
  • XPath query:用於提取值的XPath表達式: //*[@name='csrfmiddlewaretoken']/@value
  • 缺省值:取不到的時候默認值

APPly to:作用範圍(返回內容的斷言範圍)

  • Main sample and sub-samples:作用於父節點的取樣器及對應子節點的取樣器
  • Main sample only:僅作用於父節點的取樣器
  • Sub-samples only:僅作用於子節點的取樣器
  • JMeter Variable:作用於jmeter變量(輸入框內可輸入jmeter的變量名稱)

參數關聯

登錄請求fiddler抓包參數如下

jemter提取authorization_正則_16

jmeter照着寫請求參數就可以了,csrfmiddlewaretoken對應的值使用上面一步提取出來的變量${csrftoken}

jemter提取authorization_json_17

添加頭部管理器,參數類型為:Content-Type: application/x-www-form-urlencoded

jemter提取authorization_正則表達式_18

查看結果

查看請求結果,從結果裏面可以看出csrfmiddlewaretoken這個值已經傳過來了

jemter提取authorization_正則表達式_19

最後的結果失敗403 Forbidden,是因為缺少cookies,無權限訪問

jemter提取authorization_正則_20