scala 使用函数从请求中返回的字符串返回HTML表单元素的值

63lcw9qa  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(158)

基于答案和评论的更新,包括突出显示的代码
更新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或字符串到对象转换来实现这个函数或两个函数(一个用于输入,一个用于选择)。

lsmd5eda

lsmd5eda1#

以下是我的建议:
步骤1:使用jsonPathjmesPath检查获得JSON未转义的Content值。
步骤2:使用transform检查步骤从HTML字符串中提取value属性。在传入的函数中,您确实可以使用正则表达式(确保在函数的外部创建它,而不是在每次执行时编译它)或HTML解析器,如Lagarto(这是Gatling的css检查在下面使用的解析器)

相关问题