JMeter Beanshell采样器缓存图像

时间:2015-05-21 11:57:46

标签: jmeter captcha beanshell

我正在使用JMeter(2.13 r1665067)在登录和注册时使用Google Kaptcha测试网站,直到可以在测试环境中禁用它们。我已经记录了一个会话,并设置了一个保存对文件采样器的响应来提取kaptcha图像。然后我有一个Beanshell采样器显示它,以便我可以根据需要输入代码(thanks to this post)。

我现在遇到的问题是重复显示从服务器检索到的第一个图像。我已经尝试将在Beanshell中创建的任何对象设置为null后使用,并检查“在每次调用之前重置bsh.Interpreter”。

我能够通过使用$ __(随机)函数来解决在每个图像中添加唯一ID时在“保存对文件采样器的响应”中添加的问题,但会导致创建大量文件。我可以验证保存的图像文件是否在文件系统上发生变化。我也可以重新启动JMeter,或者从文件系统中清除文件以使其正确显示,但仅限第一次。通过“将响应保存到文件采样器”添加时间戳不够独特,但无论如何都会创建其他文件。

我想知道为什么JMeter似乎在缓存图像,如果每次都有一种方法可以写入和读取单个文件,那么通过附加一个唯一的ID来避免它们。我想它与我的配置有关。

Beanshell采样器代码:

filenameOrURL = new URL("file://${FILE2}");
image = Toolkit.getDefaultToolkit().getImage(filenameOrURL);
icon = new javax.swing.ImageIcon(image);
pane = new JOptionPane("Enter Captcha", 0, 0, null);
String captcha = (String)pane.showInputDialog(null, "Captcha", "Captcha", 0, icon, null,null);
filenameOrURL = image = pane = icon = null;
log.info(captcha);
vars.putObject("captcha",captcha);

保存对文件采样器参数的响应:

Filename prefix: /response/response_
Variable name: FILE

线程组:

如果我的名声在我之前,我会张贴一张图片。 :脸红:

  Recording Controller
      login.html (GET)
        Save Responses to a file
      BeanShell Sampler
      login.html (POST)
      logout.html (GET)

1 个答案:

答案 0 :(得分:1)

您的问题不是JMeter,而是Toolkit.getImage()功能。来自its documentation

  

返回从指定文件获取像素数据的图像,其格式可以是GIF,JPEG或PNG。底层工具包尝试将具有相同文件名的多个请求解析为相同的返回Image。

     

由于促进Image对象共享所需的机制可能会继续保留不再无限期使用的图像,因此鼓励开发人员在任何可用的地方使用createImage变体实现自己的图像缓存。 如果指定文件中包含的图像数据发生更改,则此方法返回的Image对象可能仍包含先前调用后从文件加载的陈旧信息。以前加载的图像数据可以手动丢弃在返回的flush上调用Image方法。