如何在Katalon Studio中存储HTML响应动态字符串供后续请求使用
Katalon Studio 提取REST接口HTML响应动态值并跨请求复用实现方案
整个流程完全可以在脚本模式下通过Groovy代码实现,不需要额外安装插件,具体操作步骤如下:
- 第一步:发送初始POST请求,获取HTML格式响应
先调用你配置好的POST接口请求对象,拿到完整响应内容,建议先做状态码校验,避免响应异常导致后续提取逻辑报错:// 替换为你自己的测试对象路径 def firstPostRequest = findTestObject('接口目录/第一个POST请求') def response = WS.sendRequest(firstPostRequest) // 校验响应状态为200,可根据你的实际接口成功状态调整 WS.verifyResponseStatusCode(response, 200) // 拿到完整的HTML响应文本 String htmlResponse = response.getResponseBodyContent() - 第二步:从HTML文本中提取目标动态字符串,两种常用方案按需选择
方案1:正则匹配提取(适合目标内容前后有固定文本标识的场景,实现最简单)
先找到目标动态值在HTML源码里的前后固定内容,写正则做捕获即可,比如你要提取的内容在<div class="dynamic-code">abc123xyz</div>标签中间,其中abc123xyz是动态变化的,代码如下:
方案2:HTML结构解析提取(适合HTML结构复杂、正则容易误匹配的场景)// 正则中括号包裹的部分就是要提取的动态内容,用非贪婪匹配.*?避免匹配范围溢出 def matcher = (htmlResponse =~ /<div class="dynamic-code">(.*?)<\/div>/) String targetValue if (matcher.find()) { targetValue = matcher.group(1) // 提取后如果有HTML转义字符可以做反转义处理 // targetValue = org.apache.commons.text.StringEscapeUtils.unescapeHtml4(targetValue) // 将值存入全局变量,全测试用例/测试套件可复用 GlobalVariable.storedDynamicValue = targetValue } else { throw new RuntimeException("HTML响应中未匹配到目标动态字符串,请检查正则规则") }
用Groovy内置的XmlSlurper解析HTML节点,按标签、属性定位目标内容:import groovy.xml.XmlSlurper def htmlParser = new XmlSlurper() // 关闭外部DTD加载,避免不规范HTML解析报错 htmlParser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false) def htmlDoc = htmlParser.parseText(htmlResponse) // 示例:查找id为verifyCode的input标签,取其value属性值,可根据你的实际节点路径调整 String targetValue = htmlDoc.body.'**'.find { it.@id == 'verifyCode' }.@value.toString() GlobalVariable.storedDynamicValue = targetValue - 第三步:在后续请求的请求体中引用存储的变量
两种使用方式都可以:- 手动模式配置请求对象时,直接在请求体对应位置写占位符
${GlobalVariable.storedDynamicValue}即可,Katalon发送请求时会自动替换为实际值 - 脚本模式下构造请求体时,直接拼接变量即可:
// 构造第二个请求的JSON请求体,把动态值填入对应字段 String secondRequestBody = """ { "verifyCode": "${GlobalVariable.storedDynamicValue}", "userId": "10001" } """ def secondPostRequest = findTestObject('接口目录/第二个POST请求') secondPostRequest.setBodyContent(new org.apache.http.entity.StringEntity(secondRequestBody, "UTF-8")) secondPostRequest.setHeader("Content-Type", "application/json") def secondResponse = WS.sendRequest(secondPostRequest)
- 手动模式配置请求对象时,直接在请求体对应位置写占位符
实操注意:
- 写正则时优先用非贪婪匹配符
.*?,不要用贪婪匹配.*,否则容易匹配到超出目标范围的内容- 提取完变量后建议加非空判断,避免后续请求因为拿不到值出现非预期报错
- 如果你的动态值存在特殊字符被HTML转义(比如
"代表双引号、&代表&),提取后记得做反转义处理再传入后续请求
内容的提问来源于stack exchange,提问作者Michele Scianatico
相关产品推荐
相关产品推荐

