我正在编写一个JMeter脚本来测试一些基于ajax的JSF 2.3页面。我可以针对我的应用程序进行身份验证并创建用户会话,但当我尝试向表单提供数据时,我通过JMeter提供的输入参数不会填充我的(ViewScoped(bean属性。但是,它们确实填充了请求参数。我知道这一点,因为当我打印这个地图时,我可以在bean中看到我的值:
HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
Map<String, String[]> paramMap = req.getParameterMap();
但是我的值不会出现在bean的字段中。
我的测试计划:
User Defined Variables
HTTP Cookie Manager
HTTP Header Manager
Regular Expression Manager
Thread Group
--Transaction Controller
----HTTP Sampler 1
----HTTP Sampler 2
----HTTP Sampler 3
----View Results Tree
我确实在cookie管理器中设置了JSESSION cookie,它们运行良好,我可以验证并导航到表单。
我知道JMeter不能以传统的方式处理ajax。我已经设置了JMeter来进行POST提交。然而,我也有一些AJAX属性,例如,我为AJAX设置了请求头:
X-Requested-With=XMLHttpRequest
我的请求参数与Firefox Developers工具中的参数相匹配,它们是:
javax.faces.source trackingForm:ctlSubmit true text/plain true
trackingForm:ctlSubmit trackingForm:ctlSubmit true text/plain true
trackingForm trackingForm true text/plain true
ctlDtFrom_input 10/02/2021 true text/plain true
trackingForm:trackingTabs:ctlDtTo_input 10/07/2021 true text/plain true
trackingForm:trackingTabs:ctlCheckThisWeek_input on true text/plain true
trackingForm:trackingTabs:ctlOrderStatus A true text/plain true
trackingForm:trackingTabs:ctlSearchNumSimple_focus true text/plain true
trackingForm:trackingTabs:ctlSearchNumSimple_input sCustPO true text/plain true
trackingForm:trackingTabs:searchAndOperAdv All true text/plain true
trackingForm:trackingTabs:searchTermListAdv:0:ctlSearchNumAdv_focus true text/plain true
trackingForm:trackingTabs:searchTermListAdv:0:ctlSearchNumAdv_input sCustPO true text/plain true
trackingForm:trackingTabs_activeIndex 1 true text/plain true
javax.faces.ViewState ${jsfViewState} true text/plain true
javax.faces.partial.ajax true true text/plain true
javax.faces.partial.execute @all true text/plain true
javax.faces.partial.render trackingForm true text/plain true
我使用Regex Manager获取viewState并填充一个变量,然后在请求参数中使用该变量。据我所知,比较响应和请求,viewState似乎工作正常。这里的一个问题是,整个事务控制器的所有响应/请求(即从登录到随后的表单提交(的viewState必须相同吗?还是一次只有两个?
同样,我的主要问题是为什么我的托管Bean没有被填充,因为我可以清楚地看到请求参数正在到达它?非常感谢。
如果您观察到这些值,但它们没有按预期工作,则意味着您发送的请求与浏览器发送的请求不同。
不幸的是,如果没有看到来自浏览器和JMeter的完整请求,就不可能提供全面的答案,所以我只能建议使用Fiddler或Burp等第三方嗅探器工具,并将来自浏览器的完整请求与来自JMeter。
假设请求是相同的(除了需要关联的动态值(,您应该得到相同的(成功的(响应。
如果您能够使用浏览器成功执行请求,您只需使用JMeter的HTTP(s(测试脚本记录器记录即可