在Jmeter中执行Javascript的更好方法

时间:2016-02-24 15:51:40

标签: jmeter

我的Jmeter脚本的SetUp部分包含在生成实际负载之前绕过Web应用程序的登录页面的步骤。作为这些步骤的结果,服务器设置了证明成功登录的特定cookie。

为此,我的脚本应该执行由服务器响应注入的Javascript函数。由于这是一次性程序,我使用WebDriver并在浏览器实例中执行Javascript。

但是我绝对不能像加载线程的一部分那样做,因为WebDriver对于性能测试来说不是一个好主意(根本不是)。

然而,我仍然想知道它是一种在不创建浏览器实例的情况下计算JS的方法,因为我的JS脚本只是算术计算(尽管很复杂)。所以,

  1. 非常感谢有关如何在不创建浏览器实例的情况下执行JS的任何想法。因为我可以编写BeanShell代码,所以它不应该是一个大问题(只需共享可以为与DOM无关的计算创建“虚拟”浏览器的lib名称)。不确定它会更快,但我会尝试。
  2. 如果我是对的并且浏览器使用是唯一可行的解​​决方案,那么我正在寻找一种在不同线程之间共享一个浏览器窗口的方法(即使等待它的人有延迟)。试图使用JavascriptExecutor,但不知道如何将WebDriver转换为JavascriptExecutor(beanshell是使用太旧的Java编写的,我不熟悉它的语法和功能)。也不能使用WebDriver插件,因为它不允许在没有get(“pageUrl”)的情况下创建窗口。
  3. 提前感谢任何想法。

1 个答案:

答案 0 :(得分:9)

  1. 您可以使用JSR223 Sampler,从“语言”下拉菜单中选择javascript,然后将代码放入“脚本”区域

    JSR223 JavaScript

  2. 您可以使用WebDriver Sampler对浏览器中的所有线程使用单个浏览器实例,例如:

    var ctx = org.apache.jmeter.threads.JMeterContextService.getContext()
    var vars = ctx.getVariables();
    
    for (var i=0; i< THREADS_NUMBER; i++) {
        WDS.browser.manage().deleteAllCookies()
        WDS.browser.get('LOGIN_PAGE_URL')
        var cookie = WDS.browser.manage().getCookieNamed("COOKIE_NAME").getValue();
        vars.put("cookie" + i, cookie);
    }
    

    它将生成JMeter变量,如:

    cookie1=foo
    cookie2=bar
    etc.
    
  3. 因此,您可以在需要时使用__threadNum()函数来引用变量值,如:

    ${__evalVar(cookie${__threadNum})}
    

    有关使用WebDriver Sampler的更多信息,请参阅The WebDriver Sampler: Your Top 10 Questions Answered指南。