基于答案和评论的更新,包括突出显示的代码
更新1:
描述:其想法是获取Body(字符串)并将其发送给带有myElementName(字符串)的函数GetValueOfInputAsString,该函数以字符串的形式返回值,然后将其保存在会话变量mySessionName中,以便在下一次请求中使用它作为“${mySessionName}”。
我希望这段代码能够基于在StackOverflow上找到的答案来工作(就像这个答案https://stackoverflow.com/a/50827447)。
exec(
http(myName)
.get(myUrl)
.check(
bodyString.transform(
(body: String, session: Session) => {
session.set("mySessionName", GetValueOfInputAsString(body, myElementName) );
}
)
)
)
但是,这会导致以下错误:
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) => {
^
代码必须是什么才能实现“描述”中的目标?
原文
我发出一个请求(GET或POST),然后返回包含一个HTML表单的JSON。我需要获取各种输入的值并选择字符串中的元素。
响应示例:
{ "Content": "<form><input id=\"MyFieldName\" name=\"MyFieldName\" type=\"hidden\" value=\"hello\" /><input id=\"AnotherField\" name=\"AnotherField\" type=\"hidden\" value=\"world\" /><select id=\"MyDropDown\" name=\"MyDropDown\"><option value=\"123\">First option</option><option selected value=\"456\">Second option</option></select></form>" }
我的目标是创建一个接受两个参数(html-字符串、元素名)并返回值(来自值属性)的函数。
似乎我是唯一一个想到这样做的人,因为大多数使用RegEx的Scala-Gatling相关问题都内联在“.Check”中。
我对Scala和Gatling非常陌生,但已经用许多其他语言(Java、C#、JavaScript、VBScript、PHP)编程。
方法1-使用RegEx
尽管我对此并不熟悉,但我还是成功地创建了以下(老套)解决方案:
def getValueOfInput(data: String, name: String) : String = {
// Variable that contains the return value
var value = "";
// This RegEx gets the specific INPUT-element
var patternLine : Regex = ("(?:name=\"" + name + "\")(?: type=\"hidden\"){0,} value=\"(.*?)\"").r;
// This RegEx gets the VALUE-attribute with attribute name and double quotes
var patternValue : Regex = ("(?:value=\")(.*?)(?:\")").r;
// Get the INPUT-element
var line = patternLine.findFirstIn(data).getOrElse("no match line")
// Get the VALUE-attribute
value = patternValue.findFirstIn(line).getOrElse("no match value")
// Remove the text "value=" and double quotes
value = value.replaceAll("value=|\"", "");
// Return the actual value
return value;
}
如果我调用getValueOfInput(myJsonString, "MyFieldName")
,我得到的值是“Hello”,这是正确的值。
也许有一种方法可以让First RegEx获得价值,但我不知道怎么做。
这可能有很多种失败的方式(0匹配等),并且它目前不支持选择元素,这些选择元素的值在选项中具有带有“选定”属性的值。
方法2-将字符串转换为对象
我还试图找到一种方法来获取字符串,并将其转换为可使用类似“.Check(css(...))”的类似于HTMLDOM元素进行解析/遍历的对象。它在发出请求时使用。
不幸的是,我无法找到转换字符串的方法,如果Scala/Gatling支持的话,我也不能这样做。
。
我希望有人知道如何使用RegEx或字符串到对象转换来实现这个函数或两个函数(一个用于输入,一个用于选择)。
1条答案
按热度按时间lsmd5eda1#
以下是我的建议:
步骤1:使用
jsonPath
或jmesPath
检查获得JSON未转义的Content
值。步骤2:使用
transform
检查步骤从HTML字符串中提取value
属性。在传入的函数中,您确实可以使用正则表达式(确保在函数的外部创建它,而不是在每次执行时编译它)或HTML解析器,如Lagarto(这是Gatling的css
检查在下面使用的解析器)