You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:31:10