在过去的几周里,我一直在学习Jmeter,所以它对我来说仍然是一个新的主题。我创建的最后一个测试包括登录、一些页面导航和最后的表单提交。整个测试都有效,但最后一个表单的内容没有提交到数据库,我相信这是因为它是通过JavaScript制作的,特别是这个脚本:
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['WebForm1'];
if (!theForm) {
theForm = document.WebForm1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
根据我所学到的,我应该使用JSR223 Sampler或Post处理器来执行脚本,但我不知道如何做到这一点。我应该复制JavaScript代码,使其产生相同的结果还是可以简单地重用原始JavaScript?
提前感谢!
编辑:我想我问得太早了。我显然不能重用JavaScript代码。我想应该使用JMeterContext和JMeterVariables中的方法来完成,这是我刚刚发现的。我的方向对吗?
像JMeter这样的工具的想法是在协议级别(在本例中为HTTP(复制用户行为。JMeter将不会为您的网站构建DOM表示,因此将无法执行您在浏览器中看到的执行的Javascript。您应该使用HTTP请求采样器,选择POST HTTP方法,并将表单数据放入parameters部分。所有这些Javascript都是纯粹的客户端行为,因此不属于您的JMeter测试。
请提供更多细节,如果你已经尝试过,但失败了!
根据JMeter项目主页:
JMeter不是浏览器,它在协议级别工作。就web服务和远程服务而言,JMeter看起来像一个浏览器(或者更确切地说,是多个浏览器(;然而,JMeter并不能执行浏览器支持的所有操作特别是,JMeter不执行HTML页面中的Javascript它也不像浏览器那样呈现HTML页面(可以将响应视为HTML等,但时间不包括在任何示例中,并且一次只显示一个线程中的一个示例(。
因此,您不需要复制JavaScript,您需要使用JMeter的HTTP请求采样器复制此JavaScript函数生成的HTTP POST请求
您当前请求"不起作用"的最可能原因是这些__EVENTTARGET
和__EVENTARGUMENT
动态参数的相关性缺失或实现不当。
如果您只是记录了这些参数,而没有对它们做任何操作,您将无法成功回放脚本,因为每次访问应用程序时这些参数都有不同的值,因此它们需要相关,例如:
- 打开应用程序的第一页
- 使用合适的JMeter后处理器(很可能是CSS选择器提取器(至少提取这些
__EVENTTARGET
和__EVENTARGUMENT
值,并将它们存储到JMeter变量中 - 在随后的请求中,将记录的硬编码值替换为步骤2中的JMeter变量
查看ASP.NET Login Testing with JMeter文章,以获得更全面的解释,并举例说明如何处理动态请求参数。
另外,不要忘记将HTTP Cookie管理器添加到您的测试计划中