我正在使用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)
答案 0 :(得分:1)
您的问题不是JMeter,而是Toolkit.getImage()
功能。来自its documentation:
返回从指定文件获取像素数据的图像,其格式可以是GIF,JPEG或PNG。底层工具包尝试将具有相同文件名的多个请求解析为相同的返回Image。
由于促进Image对象共享所需的机制可能会继续保留不再无限期使用的图像,因此鼓励开发人员在任何可用的地方使用createImage变体实现自己的图像缓存。 如果指定文件中包含的图像数据发生更改,则此方法返回的Image对象可能仍包含先前调用后从文件加载的陈旧信息。以前加载的图像数据可以手动丢弃在返回的
flush
上调用Image
方法。