如何在jmeter中把响应中的数据提取出来并引用

在这里插入图片描述
jmeter做接口测试过程中,经常遇到请求需要用到token的时候,我们可以把返回token的接口用后置处理器提取出来,但是在这种情况下,只能适用于当前的线程组,其他线程组无法引用到提取的token变量值,所以必须要生成全局变量让测试计划下的所有线程组都可以引用变量。

同一个线程组下提取token并引用

1、执行获取token接口(登录接口),在查看结果树这里,使用$符号提取token值

. 根节点, .根节点,.根节点,.data.token 表示提取根节点下的data节点下的token节点的值

在这里插入图片描述

2、使用json提取器,提取登录接口响应结果中的access_token,保存在变量token中

变量路径就是把在结果树提取的路径写上

在这里插入图片描述

3、可以使用调试取样器查看提取的token值是否正确

在这里插入图片描述

4、下一个接口(列表查询接口)中,需要使用上个登录接口返回的token值,使用${token}引用

在这里插入图片描述

不同线程组下提取token并引用

1、使用json提取器提取登录接口响应结果中的access_token,保存在变量token中,操作与上文提到的一样。

2、使用函数助手对话框的setProperty函数,有两个输入框要填写(属性名称和Value of property),属性名称填写一个全局变量名,Value of property填写json提取器提取的access_token(json提取器提取到的access_token赋值给了变量token,此处引用变量${token}得到)

在这里插入图片描述

3、在json提取器下添加一个后置处理器BeanShell PostProcessor;

在这里插入图片描述

4、把生成的setProperty函数(KaTeX parse error: Expected group after '_' at position 2: {_̲_setProperty(ne…{token},)})复制到BeanShell PostProcessor中,此时已经把接口需要用到的access_token生成了并保存在全局变量new_token中。

在这里插入图片描述

5、引用该全局变量有两种方式

(1)使用函数助手中的property函数,只填写属性名称对应的输入框:全局变量名new_token

在这里插入图片描述

把生成的结果填写到列表查询接口需要引用的地方

在这里插入图片描述

(2)使用函数助手中的P函数,只填写属性名称对应的输入框:全局变量名new_token

在这里插入图片描述

把生成的结果填写到列表查询接口需要引用的地方

在这里插入图片描述

总结

KaTeX parse error: Expected group after '_' at position 2: {_̲_setProperty()}…{__property()}/${__P()}一起配合使用,setProptety等于把值拿出来,
__property/__P 对值进行使用

__P是__property函数的简化版,举个例子:KaTeX parse error: Expected group after '_' at position 2: {_̲_P(prop1)}会返回属性…{__P(prop1,123)} 会返回属性prop1的值,如果prop1未定义值,则返回123;

__property和__P之间的区别:用法上__property函数仅仅是比__P函数多了一个可以存值的变量,举个__property用法例子:${__property(pro,var,abcd)}会返回pro的值,如果pro未定义值则会返回abcd,同时会将pro的值存到变量var中

注意事项

如果遇到跨线程组调用参数值不是token值而是变量名时且登录接口能够正常使用的情况下,请检查线程组设置

在这里插入图片描述

原因:如果不设置此项,会导致jmeter测试计划下所有添加的线程组同步运行,导致token还没获取出来就已经在调用了,导致获取值时出现错误

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

<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`等)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值