正则表达式提取器
- 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": "武汉市"
}]
}
假设我们要提取time
和context
。提取器填写如下:
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_Ñ_g
,refName
取默认值;若为0
或正数
,只提取一个匹配项,变量名称规则refName_g
,refName
取模板创建值; - Template填入
$0$
,refName_Ñ
对应的值为匹配到的整个匹配项;若填入$1$$3$
,则refName_Ñ
对应的值为refName_Ñ_g1
和refName_Ñ_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表达式。语法参考:JSoup、Jodd-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,只能获取几个常见属性,像下面的
type
,name
,id
,tabindex
,但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