在Jmeter中执行Javascript的更好方法

Kon*_*bov 4 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")的情况下创建窗口.

提前感谢任何想法.

Dmi*_*i T 10

  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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    它将生成JMeter变量,如:

    cookie1=foo
    cookie2=bar
    etc.
    
    Run Code Online (Sandbox Code Playgroud)

因此,您可以使用__threadNum()函数在需要时引用变量值,如:

${__evalVar(cookie${__threadNum})}
Run Code Online (Sandbox Code Playgroud)

有关使用WebDriver采样器的更多信息,请参阅WebDriver采样器:您回答的十大问题指南.