在 JMeter java api 如何在 PreProcessor 采样器中设置 POST 表单值?
In JMeter java api how to set POST Form values in a PreProcessor sampler?
在我正在编写的预处理器中,我可以通过采样器成功更新 GET 查询字符串。
但是,如果我对 POST 使用相同的方法,虽然我可以通过 getArguments() 列出 FORM 字段,但不会设置该值。
Arguments arguments = sampler.getArguments();
for (int i=0; i<arguments.getArgumentCount(); i++) {
Argument argument = arguments.getArgument(i);
if (argument.getName().equals("page_submission_id")) {
String newVal = "8743718386872";
argument.setValue(newVal);
System.out.println("Setting arg["+argument.getName()+"] to["+newVal+"]");
}
}
sampler.setArguments(arguments);
printArgs(arguments);
此输出显示参数值未更改。
Setting arg[page_submission_id] to[8743718386872]
Arguments After
...
Found arg[page_submission_id] is[XXXXXXXXXXXXX]
...
进一步深入研究 jmeter 代码后,Attribute 对象有一个 "runningVersion" 属性(通过 isRunningVersion())设置为 true。
我已经尝试了几种方法来解决这个问题:
- 将 runningVersion 强制设置为 false - 然后设置值但发送 GET 消息
- 创建一个新的 Arguments 对象并向其添加带有值的新 Argument 条目 - 这不会更改值
谁能指出在 POST 发送之前设置 FORM 字段值的官方方法?
谢谢
好吧,您为参数分配了一个新值,但我没看到您在哪里用具有新值的参数更新采样器的参数。
我坚信 KISS 原则,因此与其添加更多行,我建议您按如下方式简化脚本:
import org.apache.jmeter.config.Argument;
sampler.getArguments().removeArgument("page_submission_id");
sampler.addArgument("page_submission_id","8743718386872");
另外,我希望您正在使用 JSR223 PreProcessor and Groovy language。
我设法解决了这个问题:
- (最初)通过清理线程池,作为我的初始
尝试包括许多东西,例如“正则表达式
提取器”和 "User defined variables"。一旦这些被删除
我使用的方法成功地改变了参数值,
(当深入我的设置时,问题又回来了)通过创建一个新的 Argments 对象并插入(以相同的顺序)具有我需要的值集的新 Argument 对象。然后将采样器设置为使用新的 Arguments 对象。
Arguments newArgs = new Arguments();
Arguments arguments = sampler.getArguments();
for (int i=0; i<arguments.getArgumentCount(); i++) {
Argument argument = arguments.getArgument(i);
HTTPArgument newArg = new HTTPArgument();
newArg.setName(arguments.getName());
if (arguments.getName().equals("field_to_replace")) {
newArg.setValue("new value");
}
else {
newArg.setValue(arguments.getValue());
}
newArgs.addArgument(newArg);
}
sampler.setArguments(newArgs);
我的看法是,这归结为 "Argument.setValue()" 使用的 setProperty() 中的 "if (isRunningVersion())" 测试,我被绊倒了。
虽然这似乎有效(对于我目前的测试用例),但我明白重写它可能不是正确的正式方法。
在我正在编写的预处理器中,我可以通过采样器成功更新 GET 查询字符串。
但是,如果我对 POST 使用相同的方法,虽然我可以通过 getArguments() 列出 FORM 字段,但不会设置该值。
Arguments arguments = sampler.getArguments();
for (int i=0; i<arguments.getArgumentCount(); i++) {
Argument argument = arguments.getArgument(i);
if (argument.getName().equals("page_submission_id")) {
String newVal = "8743718386872";
argument.setValue(newVal);
System.out.println("Setting arg["+argument.getName()+"] to["+newVal+"]");
}
}
sampler.setArguments(arguments);
printArgs(arguments);
此输出显示参数值未更改。
Setting arg[page_submission_id] to[8743718386872]
Arguments After
...
Found arg[page_submission_id] is[XXXXXXXXXXXXX]
...
进一步深入研究 jmeter 代码后,Attribute 对象有一个 "runningVersion" 属性(通过 isRunningVersion())设置为 true。
我已经尝试了几种方法来解决这个问题:
- 将 runningVersion 强制设置为 false - 然后设置值但发送 GET 消息
- 创建一个新的 Arguments 对象并向其添加带有值的新 Argument 条目 - 这不会更改值
谁能指出在 POST 发送之前设置 FORM 字段值的官方方法?
谢谢
好吧,您为参数分配了一个新值,但我没看到您在哪里用具有新值的参数更新采样器的参数。
我坚信 KISS 原则,因此与其添加更多行,我建议您按如下方式简化脚本:
import org.apache.jmeter.config.Argument;
sampler.getArguments().removeArgument("page_submission_id");
sampler.addArgument("page_submission_id","8743718386872");
另外,我希望您正在使用 JSR223 PreProcessor and Groovy language。
我设法解决了这个问题:
- (最初)通过清理线程池,作为我的初始 尝试包括许多东西,例如“正则表达式 提取器”和 "User defined variables"。一旦这些被删除 我使用的方法成功地改变了参数值,
(当深入我的设置时,问题又回来了)通过创建一个新的 Argments 对象并插入(以相同的顺序)具有我需要的值集的新 Argument 对象。然后将采样器设置为使用新的 Arguments 对象。
Arguments newArgs = new Arguments(); Arguments arguments = sampler.getArguments(); for (int i=0; i<arguments.getArgumentCount(); i++) { Argument argument = arguments.getArgument(i); HTTPArgument newArg = new HTTPArgument(); newArg.setName(arguments.getName()); if (arguments.getName().equals("field_to_replace")) { newArg.setValue("new value"); } else { newArg.setValue(arguments.getValue()); } newArgs.addArgument(newArg); } sampler.setArguments(newArgs);
我的看法是,这归结为 "Argument.setValue()" 使用的 setProperty() 中的 "if (isRunningVersion())" 测试,我被绊倒了。
虽然这似乎有效(对于我目前的测试用例),但我明白重写它可能不是正确的正式方法。