JMeter中从JUnit Request提取Cookie并跨线程组传递失败求助
解决方案
问题原因
JUnit Request采样器本身没有内置CookieManager,你之前用ctx.getCurrentSampler().getCookieManager()会返回null,导致无法提取Cookie。要解决这个问题,需要直接在Selenium代码里获取浏览器Cookie并存入JMeter全局属性,再在其他线程组读取使用。
步骤1:修改JUnit Request中的Selenium代码,提取Cookie并存入全局属性
在登录逻辑完成后,添加以下代码获取目标Cookie,转换为JMeter兼容格式后存入全局属性:
import org.apache.jmeter.threads.JMeterContextService; import org.apache.jmeter.protocol.http.control.Cookie; import org.openqa.selenium.Cookie; // 登录成功后,从浏览器获取目标Cookie Cookie seleniumCookie = driver.manage().getCookieNamed(".AspNetCore.Cookies"); // 将Selenium Cookie转换为JMeter Cookie对象 Cookie jmeterCookie = new Cookie( seleniumCookie.getName(), seleniumCookie.getValue(), seleniumCookie.getDomain(), seleniumCookie.getPath(), seleniumCookie.getExpiry(), seleniumCookie.isSecure(), seleniumCookie.isHttpOnly(), seleniumCookie.getSameSite().toString() ); // 存入JMeter全局属性,供其他线程组访问 JMeterContextService.getContext().getProperties().put("MySessionCookie", jmeterCookie);
步骤2:保留原BeanShell前置处理器(无需修改)
原有的BeanShell前置处理器可以继续使用,它会从全局属性中读取Cookie并添加到当前采样器的CookieManager:
import org.apache.jmeter.protocol.http.control.CookieManager; import org.apache.jmeter.protocol.http.control.Cookie; CookieManager manager = sampler.getCookieManager(); manager.add(props.get("MySessionCookie"));
替代方案:无法修改Selenium代码时,用JSR223后置处理器提取
如果不能修改JUnit Request的Java代码,可在JUnit Request下添加JSR223后置处理器,通过获取Selenium驱动实例提取Cookie(前提是你的Selenium代码已将driver存入JMeter属性):
import org.apache.jmeter.protocol.http.control.Cookie; import org.openqa.selenium.Cookie as SeleniumCookie; // 从JMeter属性中获取Selenium驱动实例 def driver = props.get("driver"); SeleniumCookie seleniumCookie = driver.manage().getCookieNamed(".AspNetCore.Cookies"); // 转换为JMeter Cookie并存入全局属性 def jmeterCookie = new Cookie( seleniumCookie.getName(), seleniumCookie.getValue(), seleniumCookie.getDomain(), seleniumCookie.getPath(), seleniumCookie.getExpiry(), seleniumCookie.isSecure(), seleniumCookie.isHttpOnly(), seleniumCookie.getSameSite().toString() ); props.put("MySessionCookie", jmeterCookie);
之后原BeanShell前置处理器保持不变即可。
内容的提问来源于stack exchange,提问作者Mega Bat
相关产品推荐
相关产品推荐

