Fork me on GitHub

JMeter后置处理器之常用提取器介绍

正则表达式提取器

  • Name of created variable:用于存储结果的变量名称
  • Regular Expression:正则表达式
  • Template:模板,用于从找到的匹配项创建字符串的模板。$1$表示组1$2$表示组2$0$表示整个表达式匹配的内容,模板创建的字符串即为上面变量名称对应的值。
  • Match No.:指示要使用的匹配项。0为随机,正数n表示第n个匹配项,-1表示匹配所有。
  • Default Value:默认值,可为空

练习网址:JSON API免费接口

这里以JSON响应的查询快递信息为例,返回值如下(已美化且掐头去尾):

{
    "message": "ok",
    "nu": "11111111111",
    "ischeck": "1",
    "condition": "F00",
    "com": "yuantong",
    "status": "200",
    "state": "3",
    "data": [{
        "time": "2019-04-19 02:36:56",
        "ftime": "2019-04-19 02:36:56",
        "context": "[长沙市]到长沙市【长沙转运中心】",
        "location": "长沙市"
    }, {
        "time": "2019-04-18 19:32:26",
        "ftime": "2019-04-18 19:32:26",
        "context": "[武汉市]武汉市【武汉转运中心】,正发往【长沙转运中心】",
        "location": "武汉市"
    }]
}

假设我们要提取timecontext。提取器填写如下:

Name of created variable: data
Regular Expression: "time":"(.*?)","ftime":"(.*?)","context":"(.*?)"
Template: $0$
Match No.: -1

使用Debug Sampler,获得变量名称和对应值如下:

data=
data_1="time":"2019-04-19 02:36:56","ftime":"2019-04-19 02:36:56","context":"[长沙市]到长沙市【长沙转运中心】"
data_1_g=3
data_1_g0="time":"2019-04-19 02:36:56","ftime":"2019-04-19 02:36:56","context":"[长沙市]到长沙市【长沙转运中心】"
data_1_g1=2019-04-19 02:36:56
data_1_g2=2019-04-19 02:36:56
data_1_g3=[长沙市]到长沙市【长沙转运中心】
data_2="time":"2019-04-18 19:32:26","ftime":"2019-04-18 19:32:26","context":"[武汉市]武汉市【武汉转运中心】,正发往【长沙转运中心】"
data_2_g=3
data_2_g0="time":"2019-04-18 19:32:26","ftime":"2019-04-18 19:32:26","context":"[武汉市]武汉市【武汉转运中心】,正发往【长沙转运中心】"
data_2_g1=2019-04-18 19:32:26
data_2_g2=2019-04-18 19:32:26
data_2_g3=[武汉市]武汉市【武汉转运中心】,正发往【长沙转运中心】
data_matchNr=2

说明:

  • Match No.值为-1,提取全部的2个匹配项,变量名称规则refName_Ñ_grefName取默认值;若为0正数,只提取一个匹配项,变量名称规则refName_grefName取模板创建值;
  • Template填入$0$refName_Ñ对应的值为匹配到的整个匹配项;若填入$1$$3$,则refName_Ñ对应的值为refName_Ñ_g1refName_Ñ_g3的拼接。
  • 有大佬做了个图解的,看起来更直观更好理解:Regular Expression Extractor in JMeter

JSON提取器

可以使用JSON-PATH语法JSON响应中提取数据。

  • Name of created variables:变量名称。注意这里是复数形式,可以填写多个变量名称,名称与名称之间用;分隔。
  • Json Path expressions:JSON路径表达式。
  • Match No.:指示要使用的匹配项。用法与正则表达式提取器中一致。
  • Default Values:默认值。注意如果提取多个变量一定要填默认值,且不能为空(可以是空格)
  • Compute concatenation var:计算连接变量。如果找到很多结果,插件将使用,将它们连接起来并将其存储在名为<variable name>_ALL的变量中。

例子参考正则表达式提取器的例子,提取器填写如下:

Name of created variables: time;context
Json Path expressions: $.data[*].time;$..context
Match No.: -1;-1
Compute concatenation var:✔
Default Values: 0;0

获得变量名称和对应值如下:

context_1=[长沙市]到长沙市【长沙转运中心】
context_2=[武汉市]武汉市【武汉转运中心】,正发往【长沙转运中心】
context_ALL=[长沙市]到长沙市【长沙转运中心】,[武汉市]武汉市【武汉转运中心】,正发往【长沙转运中心】
context_matchNr=2
time_1=2019-04-19 02:36:56
time_2=2019-04-18 19:32:26
time_ALL=2019-04-19 02:36:56,2019-04-18 19:32:26
time_matchNr=2

说明:

  • 表达式、默认值一定要和变量数量匹配
  • 表达式路径中数组编号用*表示模糊匹配
  • 关于JSON PATH表达式更高级的运用,可以参考:JSON Path PostProcessor in JMeter

CSS/JQuery提取器

可以使用CSS Selector语法从服务器HTML响应中提取值。

  • CSS/JQuery expression:CSS/JQuery表达式。语法参考:JSoupJodd-Lagarto(CSSelly)
  • Attribute:从与选择器匹配的节点中提取的属性名称。如果为空,则返回此元素及其所有子元素的组合文本。

这里以Redmine登录页面为例,提取器填写如下:

Name of created variables: input
CSS/JQuery expression: #login-form > form > table > tbody > tr > td > input
Attribute: name
Match No.: -1

获得变量名称和对应值如下:

input=
input_1=username
input_2=password
input_3=login
input_matchNr=3

说明:

  • 似乎有点bug,只能获取几个常见属性,像下面的typenameidtabindex,但autocomplete不行,但使用应该足够了。

    <input type="text" name="username" id="username" tabindex="1" autocomplete="off">
    
  • 获取CSS表达式有个简单的方法,Chrome浏览器直接能Copy Selector。

XPATH 提取器

可以使用XPath查询语言从结构化响应(XML或(X)HTML)中提取值。

  • Use Tidy:宽容解析器。解析HTML响应一定要勾选
  • Use Namespaces:使用命名空间。这个放到XPATH2提取器里重点介绍,这里忽略就好。
  • Return entire XPath fragment instead of text content?:返回整个XPath片段而不只是文本内容,例如//title将返回<title>Apache JMeter</title>而不是Apache JMeter
  • XPath query:XPath表达式。语法参考:XPath

练习网址:WeatherWebService

这里以查询支持的城市为例,返回值如下:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
  <string>北京 (54511)</string>
  <string>上海 (58367)</string>
  <string>天津 (54517)</string>
  <string>重庆 (57516)</string>
</ArrayOfString>

提取器填写如下:

XML Parsing Options: 不勾选
Name of created variables: city
XPath query: //string
Match No.: -1

获得变量名称和对应值如下:

city=北京 (54511)
city_1=北京 (54511)
city_2=上海 (58367)
city_3=天津 (54517)
city_4=重庆 (57516)
city_matchNr=4

说明:

  • 勾选Return entire XPath fragment instead of text content?后,变量值是包含命名空间内容的: city=<string xmlns="http://WebXml.com.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">北京 (54511)</string>
  • Chrome浏览器同样可以直接Copy XPath。

XPATH2 提取器

虽然JMeter官方文档说可以使用XPath2查询语言从结构化响应(XML或(X)HTML)中提取值,但目前测试只支持从XML响应中提取值;从HTML中提取会报错,这个可以通过查看结果树中选择XPath2 Tester来验证。

  • Namespaces aliases list:命名空间别名列表。就是这个功能,能让使用命名空间比使用旧的XPath提取器更方便。关于命名空间含义,可以看官方文档:XML 命名空间,但是写的不够详细,详细的参考这里:XML 命名空间(XML Namespaces)介绍以及节点读取方法。由于XPath2对于表达式的要求比较严格,对于带命名空间的XML(包括默认的命名空间),使用不带命名空间前缀的表达式是查询不到结果的。

下面看具体实例,提取器填写如下:

Name of created variables: city
XPath query: //cityNS:string
Match No.: -1
Namespaces aliases list: cityNS=http://WebXml.com.cn/

获得变量名称和对应值如下:

city=北京 (54511)
city_1=北京 (54511)
city_2=上海 (58367)
city_3=天津 (54517)
city_4=重庆 (57516)
city_matchNr=4

说明:

  • 虽然返回值包含了3个命名空间的信息,但是我们提取的值只在默认命名空间里,所以Namespaces aliases list只填入默认命名空间即可;别名可以任意命名,注意调用一致。
  • XPath2还有更高级的用法,可以支持XPath2函数,比如:compare(/book[1]/page[2],/book[2]/page[2]),参考XPath2函数

边界值提取器

可以使用左右边界从服务器响应中提取值。

  • Left Boundary:左边界。
  • Right Boundary:右边界。

用上面的例子,提取器填写如下:

Name of created variables: url
Left Boundary: ="
Right Boundary: "
Match No.: -1

获得变量名称和对应值如下:

url=
url_1=1.0
url_2=utf-8
url_3=http://www.w3.org/2001/XMLSchema-instance
url_4=http://www.w3.org/2001/XMLSchema
url_5=http://WebXml.com.cn/
url_matchNr=5

说明:

  • 类似简化版的正则表达式提取器,默认非greedy模式。但是左右边界不支持正则表达式,感觉局限性挺大,比如说上面的例子中我只要提取3个url,就很麻烦。

当然牛逼的大佬根本不用这些花哨的提取器,一个BeanShell就够了,参考文章:jmeter ---json几种读取方式,ArrayList循环读取

Comments