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

如何在Gatling中提取请求返回的HTML表单元素值并解决类型匹配错误?

问题与解决方案

一、代码类型不匹配错误修复

问题描述

尝试将请求返回的body传入GetValueOfInputAsString函数,提取值并存入会话变量时,出现类型不匹配错误:

type mismatch;
 found   : (String, io.gatling.core.Predef.Session) => io.gatling.core.session.Session
    (which expands to)  (String, io.gatling.core.session.Session) => io.gatling.core.session.Session
 required: String => ?
                                                (body: String, session: Session) => {
                                                                                 ^

正确代码写法

bodyString.transform仅接受单参数函数(仅接收body字符串),无法直接传入Session参数。要将提取的值存入会话变量,使用.saveAs()方法即可:

exec(
  http(myName)
    .get(myUrl)
    .check(
      // 转换body字符串并提取目标值,存入会话变量mySessionName
      bodyString.transform(body => GetValueOfInputAsString(body, myElementName)).saveAs("mySessionName")
    )
)

后续请求直接通过${mySessionName}引用该变量即可。


二、HTML表单元素值提取函数实现

需求背景

请求返回的JSON中包含HTML表单字符串,需要提取指定name属性的INPUT和SELECT元素的value值,要求函数接收HTML字符串、元素名两个参数,返回对应值。

方案1:优化正则表达式(支持INPUT和SELECT)

修复原正则的局限性,同时支持INPUT的value提取和SELECT选中项的value提取:

import scala.util.matching.Regex

def getFormElementValue(html: String, elementName: String): String = {
  // 匹配INPUT元素的value
  val inputPattern: Regex = s"""<input[^>]+name="$elementName"[^>]+value="([^"]+)"""".r
  // 匹配SELECT元素下选中的option的value
  val selectPattern: Regex = s"""<select[^>]+name="$elementName"[^>]*>.*?<option[^>]+selected[^>]+value="([^"]+)"""".r

  // 优先匹配INPUT,再匹配SELECT,无匹配返回空字符串
  inputPattern.findFirstMatchIn(html).map(_.group(1))
    .orElse(selectPattern.findFirstMatchIn(html).map(_.group(1)))
    .getOrElse("")
}

方案2:使用HTML解析库(更可靠,推荐)

正则处理HTML易受标签格式影响,使用jsoup库解析HTML DOM,稳定性更强:

  1. 先在项目依赖中添加jsoup(如sbt配置:libraryDependencies += "org.jsoup" % "jsoup" % "1.17.2")
  2. 实现提取函数:
import org.jsoup.Jsoup
import org.jsoup.nodes.Element

def getFormElementValue(html: String, elementName: String): String = {
  val doc = Jsoup.parse(html)
  
  // 查找INPUT元素
  val inputElement: Element = doc.select(s"input[name=$elementName]").first()
  if (inputElement != null) {
    return inputElement.attr("value")
  }
  
  // 查找SELECT元素及选中的option
  val selectElement: Element = doc.select(s"select[name=$elementName]").first()
  if (selectElement != null) {
    val selectedOption: Element = selectElement.select("option[selected]").first()
    return selectedOption.attr("value")
  }
  
  // 无匹配返回空字符串
  ""
}

内容的提问来源于stack exchange,提问作者LiveLongAndProsper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:25:30