如何在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,稳定性更强:
- 先在项目依赖中添加jsoup(如sbt配置:
libraryDependencies += "org.jsoup" % "jsoup" % "1.17.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
相关产品推荐
相关产品推荐

