Gatling性能测试:如何提取challenge.flood.io中JS生成的Token?
解决Gatling中提取JS生成Token的问题
由于Gatling仅处理HTTP响应的原始内容,不会执行前端JS代码,所以直接用css或regex抓不到JS动态生成的Token,你可以按以下思路解决:
第一步:定位Token的生成来源
打开浏览器开发者工具(F12)→ 切换到Network标签,刷新目标页面:
- 检查是否有XHR/fetch接口返回Token:很多场景下,前端JS会调用后端接口获取Token,找到这类接口后,直接在Gatling中新增请求调用该接口提取Token。
- 如果无额外接口,查看页面返回的JS代码:搜索
one_time_token或token关键词,找到生成Token的函数逻辑或变量赋值逻辑。
针对不同场景的解决方案
场景1:Token来自后端接口
假设找到接口为/api/get-one-time-token,响应为JSON格式:{"one_time_token":"xyz789"},则在Gatling中添加以下请求:
.exec( http("Fetch One-Time Token") .get("/api/get-one-time-token") .check(jsonPath("$.one_time_token").saveAs("one_time_token")) )
场景2:Token由前端JS基于参数生成
如果页面JS是基于已提取的step_id、step_number等参数生成Token,比如JS逻辑如下:
const one_time_token = btoa(`${step_id}-${step_number}-${Date.now()}`);
则在Gatling中用Scala实现相同逻辑生成Token:
.exec(session => { val stepId = session("step_id").as[String] val stepNumber = session("step_number").as[String] val token = java.util.Base64.getEncoder.encodeToString(s"$stepId-$stepNumber-${System.currentTimeMillis()}".getBytes) session.set("one_time_token", token) })
场景3:直接执行JS生成逻辑(复杂场景)
如果Token生成逻辑复杂,不想转成Scala,可以用Scala调用JS引擎执行页面中的JS代码片段(需引入GraalVM依赖):
import org.graalvm.polyglot._ // 先获取页面原始响应内容 .exec( http("Step 5 page") .get("${redirection}") .check(status.is(200)) .check(substring("Step 5")) .check(css("input[name='challenger[step_id]']", "value").saveAs("step_id")) .check(css("input[name='challenger[step_number]']", "value").saveAs("step_number")) .check(css("input[name='commit']", "value").saveAs("commit")) .check(bodyString.saveAs("pageBody")) // 保存原始页面内容 ) // 执行JS生成Token .exec(session => { val pageBody = session("pageBody").as[String] // 从页面中提取生成Token的JS代码(需根据实际JS结构调整) val jsTokenCode = pageBody.split("const one_time_token = ")(1).split(";")[0] val context = Context.create("js") val token = context.eval("js", jsTokenCode).asString() context.close() session.set("one_time_token", token) })
关键提示
不要依赖浏览器渲染后的DOM元素,Gatling只能获取HTTP响应的原始文本内容,必须找到Token的真实生成源头(后端接口或前端可复现的生成逻辑)。
内容的提问来源于stack exchange,提问作者Algety
相关产品推荐
相关产品推荐

