在Jmeter中执行Javascript的更好方法

在Jmeter中执行Javascript的更好方法,jmeter,Jmeter,Jmeter脚本的设置部分包含在生成实际负载之前绕过Web应用程序登录页的步骤。作为这些步骤的结果,服务器设置了证明成功登录的特定cookie 为此,我的脚本应该执行服务器响应注入的Javascript函数。因为这是一个一次性过程,所以我使用WebDriver并在浏览器实例中执行Javascript 但我绝对不能做加载线程的一部分,因为WebDriver对于性能测试来说根本不是一个好主意 然而,我仍然想知道这是一种不用创建浏览器实例就计算JS的方法,因为我的JS脚本只不过是算术计算(尽管很复杂)

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

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

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

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

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

  • 您可以使用,从“语言”下拉列表中选择
    javascript
    ,并将代码放在“脚本”区域

  • 您可以使用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);
    }
    
  • 因此,您将能够在需要时使用函数引用变量值,如:

    ${__evalVar(cookie${__threadNum})}
    

    有关使用WebDriver采样器的更多信息,请参阅指南

    由于您只关心生成一些HTTP请求的javascript代码的结果,因此直接模拟该结果要比找到让javascript以与在浏览器中相同的方式运行的方法容易得多。例如,如果JS生成/计算http请求传递给服务器的cookie,您可以使用BeanShell或其他脚本语言生成相同的cookie,而无需运行“真正的”javascript,这实际上非常常见。Kiril,谢谢您的回答。代码是自模糊的,我无法恢复脚本中所有计算的逻辑。所以,你肯定是对的,我已经尝试过用同样的方法(用BeanShell模拟JS计算),但没有成功。非常感谢你,Dmitri!这正是我想要的。
    ${__evalVar(cookie${__threadNum})}