在JMeter java api中,如何在PreProcessor采样器中设置POST Form值



在我正在编写的预处理器中,我可以通过采样器成功更新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。

我已经尝试了几种方法来解决这个问题:

  • 强制运行版本为 false - 然后设置值,但发送 GET 消息
  • 创建一个新的参数对象,并用值向其添加新的参数条目 - 这不会改变值

任何人都可以指出在发送之前设置 POST FORM 字段值的官方方法吗?

谢谢

好吧,您为参数分配了一个新值,但我看不到您使用具有新值的参数更新 sampler 的参数的位置。

我坚信 KISS 原则,因此我建议不要

添加更多行,因此我建议简化您的脚本,如下所示:

import org.apache.jmeter.config.Argument;
sampler.getArguments().removeArgument("page_submission_id");
sampler.addArgument("page_submission_id","8743718386872"); 

我也希望你使用的是JSR223预处理器和Groovy语言。

我设法解决了这个问题:

  1. (最初)通过清理线程池,作为我的初始尝试包括许多内容,例如"正则表达式"提取器"和"用户定义的变量"。 一旦这些被删除我使用的方法成功更改了参数值,并且
  2. (当深入我的设置时,问题又回来了)通过添加新的 Argments 对象并插入(以相同的顺序)具有我所需的值的新参数对象。 然后将采样器设置为使用该新的参数对象。

    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()))"测试,我正在绊倒它。

虽然这似乎有效(到目前为止对于我的测试用例),但我很欣赏覆盖它可能不是正确的正式方法。

最新更新