使用 Cookie 管理器和正则表达式提取器时的 jMeter 问题
jMeter issue when using Cookie manager and Regular expression extractor
所以基本上我需要从第一个 http 请求的 header 响应中提取一个身份验证令牌,然后在第二个(以及以下所有)http 请求 cookie 中使用提取的数据。
这里的问题是,我为整个控制器设置了 cookie 管理器,而不是获取实际数据,而是在我的 cookie 中获取变量名称“.authToken=${auth}”。
我猜原因是当测试到达 Cookie 管理器时没有声明变量,但我希望 jmeter 足够聪明,可以在到达正则表达式提取器时声明变量。
结构
- 线程
- 缓存管理器
- Cookie 管理器(Cookie Policy:compatibility;Implementation:HC3)
- 控制器
- HTTP 请求
- 正则表达式提取器
- Http请求(这里需要用到上面Request Cookie中提取的值)
- Http请求(我这里需要在Request Cookie中使用相同的值)
- Http请求(我这里需要在Request Cookie中使用相同的值)
- .......
详情:
所有的http请求都记录在HttpClient3.1实现中
很确定我已经正确配置了变量名、正则表达式中的所有内容,因为它适用于非常特殊的情况:
它唯一一次似乎正常工作是当我在 http 请求中使用 Cookie 管理器并禁用 'main' Cookie 管理器(用于整个控制器的那个)时。然后它被正确提取,但对于这样的基本要求,这将是非常愚蠢的解决方法,而且我有很多 http 请求(超过 100 个),我需要在其中使用提取的值。
Jmeter 不需要在正则表达式提取器声明变量之前使用它,我确保域是正确的并且第一次使用它after应该已经提取出来了。
我想到的另一个解决方法是使用单独的线程,将它们链接起来并在它们之间发送变量,一旦数据被提取就启动下一个线程,但这似乎有点太过分了。
我试过的:
- 将 http 请求拆分到 2 个不同的控制器并使用 2 个不同的 Cookie 管理器 - 得到“${auth}”而不是某个值
- 在控制器上方定义用户变量,然后使用 "Apply to: Jmeter Variable" 选项 - 再次得到字符串“${auth}”而不是一些值。
- 将 Cookie 管理器移动到用于提取的 http 请求之后的位置 - 再次使用“${auth}”而不是某个值
- 设置不同的 cookie 策略(不是全部,但很少)
- 在 jmeter.properties 中设置 "CookieManager.save.cookies=true"(并且仍然为 true)
任何 help/ideas 都表示赞赏。我已经尝试解决这个问题大约一个小时了,我想我一定遗漏了一些非常简单的东西。
好的,大约 2 小时后终于解决了这个问题。
感谢这篇文章,我能够做我需要的
https://capacitas.wordpress.com/2013/06/11/thats-the-way-the-cookie-crumbles-jmeter-style-part-2/
简而言之:您需要使用 beanshell 预处理器并手动添加 cookie
这是网站死机时的 beanshell 脚本:
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
Cookie cookie = new Cookie("CookieName", vars.get("YourExtractedVariable"), "Domain", "Path", false, 0);
manager.add(cookie);
所以基本上我需要从第一个 http 请求的 header 响应中提取一个身份验证令牌,然后在第二个(以及以下所有)http 请求 cookie 中使用提取的数据。
这里的问题是,我为整个控制器设置了 cookie 管理器,而不是获取实际数据,而是在我的 cookie 中获取变量名称“.authToken=${auth}”。
我猜原因是当测试到达 Cookie 管理器时没有声明变量,但我希望 jmeter 足够聪明,可以在到达正则表达式提取器时声明变量。
结构
- 线程
- 缓存管理器
- Cookie 管理器(Cookie Policy:compatibility;Implementation:HC3)
- 控制器
- HTTP 请求
- 正则表达式提取器
- Http请求(这里需要用到上面Request Cookie中提取的值)
- Http请求(我这里需要在Request Cookie中使用相同的值)
- Http请求(我这里需要在Request Cookie中使用相同的值)
- .......
- HTTP 请求
详情:
所有的http请求都记录在HttpClient3.1实现中
很确定我已经正确配置了变量名、正则表达式中的所有内容,因为它适用于非常特殊的情况:
它唯一一次似乎正常工作是当我在 http 请求中使用 Cookie 管理器并禁用 'main' Cookie 管理器(用于整个控制器的那个)时。然后它被正确提取,但对于这样的基本要求,这将是非常愚蠢的解决方法,而且我有很多 http 请求(超过 100 个),我需要在其中使用提取的值。
Jmeter 不需要在正则表达式提取器声明变量之前使用它,我确保域是正确的并且第一次使用它after应该已经提取出来了。
我想到的另一个解决方法是使用单独的线程,将它们链接起来并在它们之间发送变量,一旦数据被提取就启动下一个线程,但这似乎有点太过分了。
我试过的:
- 将 http 请求拆分到 2 个不同的控制器并使用 2 个不同的 Cookie 管理器 - 得到“${auth}”而不是某个值
- 在控制器上方定义用户变量,然后使用 "Apply to: Jmeter Variable" 选项 - 再次得到字符串“${auth}”而不是一些值。
- 将 Cookie 管理器移动到用于提取的 http 请求之后的位置 - 再次使用“${auth}”而不是某个值
- 设置不同的 cookie 策略(不是全部,但很少)
- 在 jmeter.properties 中设置 "CookieManager.save.cookies=true"(并且仍然为 true)
任何 help/ideas 都表示赞赏。我已经尝试解决这个问题大约一个小时了,我想我一定遗漏了一些非常简单的东西。
好的,大约 2 小时后终于解决了这个问题。
感谢这篇文章,我能够做我需要的 https://capacitas.wordpress.com/2013/06/11/thats-the-way-the-cookie-crumbles-jmeter-style-part-2/
简而言之:您需要使用 beanshell 预处理器并手动添加 cookie 这是网站死机时的 beanshell 脚本:
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
Cookie cookie = new Cookie("CookieName", vars.get("YourExtractedVariable"), "Domain", "Path", false, 0);
manager.add(cookie);