【Jmeter】Jmeter中如何获取响应数据

本文介绍如何使用JMeter从接口响应中提取特定数据,重点演示了两种方法:通过正则表达式提取器及BeanShell断言提取Authorization字段。

jmeter进行接口测试时,需要依赖前一个接口中的响应数据。我们将以获取响应头的数据进行示例,介绍获取响应数据的方法,其他方法类似。

Response Header中的数据格式如下,接下来将提取Authorization字段的数据。

HTTP/1.1 200 
Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: rememberMe=deleteMe; Path=/summer; Max-Age=0; Expires=Thu, 25-Aug-2022 06:02:13 GMT; SameSite=lax
Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IllXUnRhVzR4TWpNPSIsImV4cCI6MTY2MTUwMDkzMiwidXNlcm5hbWUiOiJhZG1pbiJ9.E2y2HPuYueJ0VSVY440qzqiQHHlhCDz1xT048_MCaUk
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 26 Aug 2022 06:02:13 GMT
Keep-Alive: timeout=60
Connection: keep-alive
  1. 正则表达式提取器


在这里插入图片描述
2. Beanshell 断言
beanshell断言为脚本如下变量,脚本可直接调用,脚本如下:
在这里插入图片描述

import java.util.HashMap;
import java.util.Map;

//将字符串用换行符 截取为adc数组
String [] headersList = ResponseHeaders.split("\n");

Map headersMap = new HashMap();   //创建HashMap来从新组装headers

for(int i=1;i<headersList.length;i++){
	String [] itemList=headersList[i].split(": ");   // 将每一条Headerr项按冒号分割
	headersMap.put((itemList[0]), itemList[1]);   // 分键值放入HashMap
}

String token1 = headersMap.get("Authorization");   // 提取相应项
vars.put("token1",token1);

log.info("############ Authorization ############" + token1);
  1. BeanShell后置处理器
    在这里插入图片描述
import org.apache.jmeter.samplers.SampleResult;
import java.util.regex.*;

//指定模式在字符串中查找
String headers= prev.getResponseHeaders(); //获取headers内容,需要导入org.apache.jmeter.samplers.SampleResult 包
String pattern="Authorization:(.*)";

//创建Pattern对象
Pattern r=Pattern.compile(pattern);
String token;
//创建matcher对象
Matcher m = r.matcher(headers);
if (m.find()){
	token=m.group(1).trim();
	log.info(token);
}else{
	log.info("No Match!");
}

注:若数据支持转化为json格式,可直接转化为json格式并取值

import org.apache.jmeter.samplers.SampleResult;
import com.alibaba.fastjson.*;

String headers= prev.getResponseHeaders(); //获取请求内容
log.info("###################"+headers); //jmeter console界面输出该信息
#将string类型转化为json对象
JSONObject responseJson =JSON.parseObject(headers);
#从json对象中提取Authorization的值
String data=responseJson.getString("Authorization");
<think>我们正在处理的是关于JMeter的问题,用户之前询问了如何获取Struts的token,现在用户的新问题是:如何使用JMeter响应数据中提取HTML的? 参考站内引用,我们可以总结出JMeter提取响应数据(特别是HTML)的常用方法有两种:正则表达式提取器和JSON提取器(针对JSON响应)。但用户明确提到是从HTML中提取,所以我们重点使用正则表达式提取器,因为HTML是非结构化数据,而JSON提取器适用于结构化数据(JSON格式)。 然而,引用[3]和[4]提到JSON提取器用于JSON响应,而引用[1]和[4]都提到了正则表达式提取器。对于HTML,我们通常使用正则表达式提取器或者XPath提取器。 因此,我们将介绍两种主要方法: 1. 正则表达式提取器(Regular Expression Extractor):适用于提取HTML中的文本,通过正则表达式匹配。 2. XPath提取器(XPath Extractor):适用于XML/HTML结构,通过XPath表达式提取。 另外,引用[2]提到了如何将提取的变量设置为全局变量,以便多个线程组使用。如果需要,我们也会介绍。 步骤如下: 方法一:正则表达式提取器 步骤: 1. 在HTTP请求下添加后置处理器 -> 正则表达式提取器。 2. 配置正则表达式提取器: - 应用范围:通常选择“主样本”或“子样本”(根据实际响应位置) - 引用名称:变量名,如`myVar` - 正则表达式:根据要提取的内容编写,例如提取一个input标签的value:`<input type="hidden" name="token" value="(.+?)">` - 模板:`$1$`(表示取第一个捕获组) - 匹配数字:0表示随机,1表示第一个匹配,-1表示所有匹配(返回变量名为`myVar_1`, `myVar_2`等) - 默认:如果没匹配到,变量的(可选) 3. 在后续请求中,使用`${myVar}`引用提取的。 方法二:XPath提取器 步骤: 1. 在HTTP请求下添加后置处理器 -> XPath提取器(需要安装XPath插件,JMeter默认不提供,但也可以使用内置的XPath2 Extractor,或者使用JSR223 PostProcessor配合解析HTML) 注意:由于HTML可能不是严格规范的XML,所以有时需要先清理HTML,或者使用其他方式。在JMeter中,我们可以使用“XPath2 Extractor”(需要下载插件)或者使用“CSS/JQuery Extractor”(更简单,但需要下载插件)。 如果没有插件,我们可以使用正则表达式,或者使用JMeter内置的XPath Extractor(但要求响应是XML格式,对于HTML可能不适用)。 考虑到用户可能不想安装插件,这里重点介绍正则表达式方法。 另外,引用[4]中提到了正则表达式提取器的使用,我们可以参考。 示例:从HTML响应中提取标题 假设响应中包含:`<title>JMeter Test</title>` 正则表达式:`<title>(.+?)</title>` 如果响应是复杂的HTML,我们可以使用更精确的正则表达式,但要注意避免贪婪匹配。 全局变量设置: 如果需要在多个线程组中使用,可以使用BeanShell PostProcessor将提取的变量设置为全局变量。步骤: 1. 在提取到变量(比如`tokenValue`)后,添加BeanShell PostProcessor。 2. 在BeanShell脚本中写入:`${__setProperty(newToken, ${tokenValue})};` 3. 在其他线程组中,使用`${__P(newToken)}`引用。 但是,引用[2]提到,同一个线程组下提取的token只能在该线程组使用,其他线程组需要全局变量。所以,使用BeanShell设置全局变量是一个解决方案。 现在,我们根据上述内容整理回答。 </think> ### 使用JMeter从HTML响应中提取数据的方法 在JMeter中提取HTML响应,主要使用**后置处理器**解析HTML结构。以下是两种核心方法及详细操作步骤: --- ### 方法1:正则表达式提取器(推荐) 适用于非结构化HTML文本,通过模式匹配提取。 **步骤**: 1. **添加正则表达式提取器** - 右键点击目标HTTP请求 → 添加 → 后置处理器 → 正则表达式提取器 - 配置参数: ```java 应用到:主样本 引用名称:变量名(如 `htmlValue`) 正则表达式:匹配目标的模式(例如提取标题:`<title>(.*?)</title>`) 模板:`$1$` // 表示捕获第一个括号内的 匹配数字:`1`(取第一个匹配项) 默认:留空或设置错误提示 ``` 2. **示例:提取表单中的隐藏字段** ```html <!-- 假设HTML响应包含: --> <input type="hidden" name="csrf_token" value="a1b2c3d4"> ``` - 正则表达式:`name="csrf_token" value="(.+?)"` - 后续请求中引用:`${htmlValue}` --- ### 方法2:XPath提取器 适用于结构化HTML/XML文档,通过节点路径精准定位。需确保响应是格式良好的XHTML。 **步骤**: 1. **添加XPath提取器** - 需先安装插件:通过JMeter插件管理器安装 **XPath Extractor** - 配置参数: ```java 引用名称:变量名(如 `xpathValue`) XPath表达式:目标节点路径(如 `//input[@name='csrf_token']/@value`) 匹配数字:`1` 默认:留空 ``` 2. **示例:提取表格中的特定数据** ```html <!-- 假设HTML响应包含: --> <table> <tr><td>ID</td><td>1001</td></tr> </table> ``` - XPath表达式:`//tr/td[text()='ID']/following-sibling::td/text()` - 引用变量:`${xpathValue}` --- ### 高级技巧与注意事项 1. **处理动态属性** - 若HTML属性动态变化(如`id="input_123"`),使用部分匹配: ```regex // 正则表达式示例 id="input_(.+?)" // 提取123 ``` 2. **CSS选择器提取器(推荐插件)** - 安装 **CSS/JQuery Extractor** 插件,语法更简洁: ```java 选择器:`input[name='csrf_token']` 属性:`value` ``` 3. **调试工具** - 使用 **调试取样器(Debug Sampler)** 查看提取的变量 - 通过 **查看结果树** 检查响应结构和提取结果 4. **跨线程组共享变量** - 用BeanShell将局部变量转为全局变量[^2]: ```java // 添加BeanShell后置处理器 ${__setProperty(globalToken, ${htmlValue},)} ``` - 其他线程组引用:`${__P(globalToken)}` --- ### 完整操作流程示例 ```java 测试计划 └─ 线程组 ├─ HTTP请求(获取HTML页面) │ ├─ 正则表达式提取器:提取目标 → 保存为 `itemValue` ├─ HTTP请求(使用提取) │ ├─ 参数:`key=${itemValue}` └─ 查看结果树(验证结果) ``` > ⚠️ **注意事项** > - HTML标签大小写敏感,建议正则表达式添加`(?i)`忽略大小写,如:`(?i)<title>(.*?)</title>` > - 复杂HTML优先用XPath/CSS选择器,避免正则表达式过于复杂 > - 提取前确认响应编码正确(在HTTP请求中设置`Content encoding`为`UTF-8`等)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值