我已经在beanshell后处理器中使用正则表达式提取了一些值,现在我必须选择一个随机值并将其存储到变量中?

问题描述 投票:0回答:1


import java.util.Random;
import java.util.regex.Pattern;
 import java.util.regex.Matcher;


String responseData = prev.getResponseDataAsString();
// log.info("the response data is : " + responseData);

Pattern pattern = Pattern.compile("<option value=\"(.+?)\">(.+?)</option>");
// log.info("pattern is : " + pattern);
Matcher matcher = pattern.matcher(responseData);
// log.info("matcher is :" + matcher);

while(matcher.find())
{
    log.info("the cities are : " + matcher.group(1));
    String extractedCity = matcher.group(1);
    log.info("the extracted city is : " + extractedCity);
    vars.put("Depart_city" , extractedCity);
}[log level output of the code](https://i.stack.imgur.com/ANKbl.png)

我能够提取数据,但无法从结果中选择一个随机值并将其存储到 jmeter 变量中

regex jmeter beanshell
1个回答
0
投票
  1. 您要覆盖每次匹配的值,您应该将它们存储到List中,然后从列表中获取随机项目,例如:

    import java.util.Random;
    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    import org.apache.commons.lang.math.RandomUtils;
    
    
    String responseData = prev.getResponseDataAsString();
    // log.info("the response data is : " + responseData);
    
    Pattern pattern = Pattern.compile("<option value=\"(.+?)\">(.+?)</option>");
    // log.info("pattern is : " + pattern);
    Matcher matcher = pattern.matcher(responseData);
    // log.info("matcher is :" + matcher);
    List cities = new ArrayList();
    while(matcher.find())
    {
        log.info("the cities are : " + matcher.group(1));
        String extractedCity = matcher.group(1);
        log.info("the extracted city is : " + extractedCity);
        cities.add(extractedCity);
    }
    vars.put("Depart_city", cities.get(RandomUtils.nextInt(cities.size())));
    
  2. 使用 Beanshell 是某种形式的性能蚂蚁模式,从 JMeter 3.1 开始,您应该使用 JSR223 测试元素和 Groovy 语言来编写脚本

  3. 使用正则表达式解析 HTML 不是最好的主意,你宁愿使用 jsoup

  4. 最后但并非最不重要的一点是,您根本不需要任何脚本,您可以使用 CSS 选择器提取器

    从响应中获取随机城市到 JMeter 变量中

© www.soinside.com 2019 - 2024. All rights reserved.