Gatling:对隐藏在 HTML 响应中的一些 JSON 执行检查

阿尼亚诺尔

在 Gatling 中,我想对 HTML 响应中包含的一些 JSON 执行检查,如下所示:

<!doctype html>
<html lang="fr">
  <head>
    <script>
      var documentLoaded = performance.now();
    </script>
    <link rel="stylesheet" href="/styles/main.f14d8fab5a7e.css">
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
    <link rel="manifest" href="/manifest.json">
    <link rel="preconnect" href="https://www.gstatic.com">

    <title data-react-helmet="true">Asus Discount</title>
    <meta data-react-helmet="true" name="description" content="Asus discount”/><meta data-react-helmet="true" name="keywords" content="Asus"/>

  </head>
  <body>
  <div>Some content</div>

  <script>
      var parseStart = performance.now();
  </script>

  <script>
    window.__INITIAL_STATE__ = {some JSON}; <!-- This is what I need -->
    window.__ENV_VARIABLES__ = {some other JSON};
    window.renderTime = '76';
    window.fetchTime = '349';
  </script>
  <script type="text/javascript" charset="utf-8" src="/vendor.e33d9940372.js"></script>
  <script type="application/ld+json" src="/schema.fr.json"></script>
  </body>
</html>

我的实际解决方案(正在运行)如下所示:

def loadPageJsonInHTML(requestName: String, link: String): ChainBuilder ={
  exec(
    http(requestName)
      .get(link)
      .check(regex("""window[.]__INITIAL_STATE__ = ([^;]+)""").find.transform(s => parseSToProdList(s)).saveAs("prod_list")
      )
  )
  doIf("${prod_list.size()}" == 0){
    exec{session => session.markAsFailed}
  }
}

def parseSToProdList(jsonString: String): Seq[String] ={
  val jsonMap = jsonStrToMap(jsonString)
  val buffer = mutable.Buffer.empty[String]
  jsonMap("products").asInstanceOf[Map[String, Any]].foreach{f =>
    if(f._2.asInstanceOf[Map[String, Any]].keySet.exists(_ == "code"))
      buffer.append(f._2.asInstanceOf[Map[String, Any]]("code").asInstanceOf[String])
  }
  buffer.toSeq
}

def jsonStrToMap(jsonStr: String): Map[String, Any] = {
  implicit val formats = org.json4s.DefaultFormats
  parse(jsonStr).extract[Map[String, Any]]
}

但是,这种解决方案有几个缺点:

  1. 只要找到正则表达式,检查总是会成功,并且不关心 JSON 中是否有任何产品 -> 我稍后必须手动检查它;
  2. 拥有提取所需数据的函数比使用 Json Path 表达式(如“$.products.*.code”)更难维护,该表达式可以存储在集中路径文件中以便于维护;
  3. 这是我必须使用转换来检查请求的 JSON 的唯一地方,使其更难以阅读和理解。

我想要实现的是看起来有点像这样的东西:

def loadPageJsonInHTML(requestName: String, link: String): ChainBuilder ={
  exec(
    http(requestName)
      .get(link)
      .check(jsonPath("""$.products.*.code""").findAll.saveAs("prod_list")
  )

或者

def loadPageJsonInHTML(requestName: String, link: String): ChainBuilder ={
  exec(
    http(requestName)
      .get(link)
      .check(jsonpJsonPath("""$.products.*.code""").findAll.saveAs("prod_list")
  )

当然, jsonPath 不起作用,因为大多数答案是 HTML。jsonpJsonPath 也不起作用,因为响应中有几个 Json 字符串。

关于如何在避免某些 HTML 上的正则表达式的同时更有效地(并且很好地)执行此操作的任何好的输入?提前致谢

阿尼亚诺尔

因此,经过一番挖掘,我找到了一种使用“.transformResponse”的解决方法,以便在实际检查之前提取字符串,并为其提供一个可在 Json 中解析的默认值。然后,为了确保我们确实找到了正则表达式,我们确保它不是我们的默认值:

  def loadPageJsonInHTML(requestName: String, link: String): ChainBuilder = {
    exec(
      http(requestName)
        .get(link)
        .transformResponse{(session, response) =>
          response.copy(body = new StringResponseBody(
              (for(m <- """window[.]__INITIAL_STATE__ = ([^;]+)""".r
                           .findFirstMatchIn(response.body.string)
                  ) yield m.group(1)
              ).getOrElse("""{"error":"chain not found"}"""),
              UTF_8
            )
          )
        }
        .check(bodyString.not("""{"error":"chain not found"}"""))
        .check(jsonPath("""$.products.*.code""").findAll.saveAs("prod_list")
        )
    )
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在sails.js中的JSON响应对象中隐藏一些属性

如何隐藏一些json作为响应?

从结构中删除字段或将其隐藏在JSON响应中

从 JSON 响应中获取一些值

如何从json响应中只获取一些信息?

空手道:我可以迭代Json数组响应并执行一些条件语句

进程执行检查并在Python中获取PID

在Redux选择器中执行检查

找出隐藏在ASP Repeater中的哪些HTML表行

html溢出:隐藏在下拉菜单中

一些内容隐藏在横向模式android开发

在 WSO2 API 中从 XML 响应中隐藏或删除一些数据

如何在Django Rest Framework中隐藏一些字段以进行响应

检查数组中的每个项目成字符串,并将这些项目与一些html一起替换

我想JSON响应的一些数据存储在地图

隐藏在reactstrap中

在gridview中隐藏一些图像

Angular HTML Css标头隐藏在组件之一中

对两列执行检查,逐列复制另一个工作表

如何在SQLite android中手动执行检查点?

在CakePHP中,我应该在哪里放置对会话用户执行检查的方法?

使用雅虎的 HTMLSTRING 从 XML 或 JSON 输出中提取 HTML 并从 xml 或 json 输出中获取一些详细信息

在对JSON响应进行一些数学运算后,如何在Flutter中创建PDF文件?

根据复选框显示隐藏在jQuery中创建的html

显示html表的隐藏在javascript(IE8)中不起作用

如何以隐藏在html表单中的输入类型传递php数组

HTML 显示和隐藏在 Mozilla Firefox 中不起作用

将键值对数组作为隐藏在 html 表单中并访问它

Gulp:观看HTML文件,执行一些任务,然后执行browserSync.reload