Locust io发起GET请求时如何执行页面中的JavaScript脚本
Locust 发起请求时执行页面JS的可行方案
Locust 本身是纯HTTP协议层面的压测工具,默认仅处理网络请求的收发,不会像真实浏览器一样解析DOM结构、运行页面内嵌的JavaScript代码,原生不支持请求同时执行页面JS的需求,可通过以下两种方案实现对应要求:
方案1:集成无头浏览器实现全链路模拟
该方案完全模拟真实浏览器的页面加载逻辑,访问页面时会自动执行所有内嵌、外部引入的JS代码,适配所有依赖浏览器环境的监控脚本场景,适合对模拟真实性要求高的场景。
示例代码(Locust + Playwright 实现):
from locust import User, task, between from playwright.sync_api import sync_playwright class BrowserSimulateUser(User): wait_time = between(1, 3) def on_start(self): # 初始化无头浏览器 self.playwright = sync_playwright().start() self.browser = self.playwright.chromium.launch(headless=True) self.page = self.browser.new_page() @task def visit_target_page(self): # 访问页面时自动加载并执行所有页面JS self.page.goto(f"{self.host}/target-page-path") # 等待页面资源加载、JS执行完成 self.page.wait_for_load_state("networkidle") def on_stop(self): # 释放浏览器资源 self.page.close() self.browser.close() self.playwright.stop()
方案2:单独提取JS脚本在Python侧执行
如果监控脚本逻辑不依赖浏览器DOM、window等专属API,可提取JS代码后直接用Python的JS执行引擎运行,资源消耗远低于无头浏览器方案,适合高并发压测场景。
示例代码(Locust + PyExecJS 实现):
from locust import HttpUser, task, between import execjs from lxml import etree class JsRunUser(HttpUser): wait_time = between(1, 3) @task def request_and_execute_js(self): # 发起GET请求获取页面内容 resp = self.client.get("/target-page-path") # 从页面源码中提取目标监控JS代码,可根据实际页面标签特征调整匹配规则 html_dom = etree.HTML(resp.text) monitor_js = html_dom.xpath('//script[contains(text(), "监控脚本特征标识")]/text()')[0] # 编译并执行JS js_ctx = execjs.compile(monitor_js) # 若JS需要入参,可传入请求地址、请求头等对应参数 js_ctx.call("监控脚本入口函数名称", resp.url)
注意事项
- 若监控脚本依赖浏览器专属API,仅能使用方案1实现,方案2无浏览器环境会执行报错
- 无头浏览器的资源消耗是纯HTTP请求的10~50倍,高并发压测前需要提前评估施压机器的CPU、内存容量,避免资源不足导致压测数据失真
- 若不需要监控脚本产生脏上报数据,可在无头浏览器中配置规则拦截对应上报请求
内容的提问来源于stack exchange,提问作者Antonio Gálvez
相关产品推荐
相关产品推荐

