【问题标题】:k6 Load Testing - How extract value from HTML responsek6 负载测试 - 如何从 HTML 响应中提取值
【发布时间】:2020-07-26 10:28:19
【问题描述】:

我是第一次使用 k6 负载测试工具

我发送一个 GET 请求并在响应中发送 html。然后我需要从这个 html 中提取一些值。

在 HTML 中执行此操作的最佳方法是什么?我在文档中看到以下 3 个命令可能会有所帮助:

Response.body
Selection.find(selector)
Response.json([selector])

HTML 如下所示。我想提取csrf和transId的值

<html lang="en">

<head>
    <link rel="icon" href="data:;base64,iVBORw0KGgo=">
    <script data-container="true" nonce="ekqlmSlKlpMlCSDxgP6erg==">
        
        var SETTINGS = {

         "csrf": "I NEED THIS VALUE",
         "transId": "I ALSO NEED THIS VALUE",
        };

    </script>
    
</head>

<body>
</body>

</html>

我想我可以使用 Response.body 然后搜索子字符串来做到这一点。这是最好的方法吗?

【问题讨论】:

    标签: javascript load-testing k6


    【解决方案1】:

    首先,要获取脚本标签的内容,可以这样做

      const doc = parseHTML(res.body);
    
      const script = doc.find('head script');
      const scriptContent = script.text();
    

    现在从

    中提取所需的值
      var SETTINGS = {
    
         "csrf": "I NEED THIS VALUE",
         "transId": "I ALSO NEED THIS VALUE",
        };
    

    您将不得不进行一些不推荐用于负载测试脚本的字符串操作。但是你可以

    a.substr(28, 15)
    

    获取csrf值和

    a.substr(57, 22)
    

    获取 transId 值。

    【讨论】:

      【解决方案2】:

      因为在这种情况下你有 javascript,你可以评估它并获取值

      import html from "k6/html";
      export default function () {
          var res = `<html lang="en">
      
              <head>
                  <link rel="icon" href="data:;base64,iVBORw0KGgo=">
                  <script data-container="true" nonce="ekqlmSlKlpMlCSDxgP6erg==">
      
      
                      var SETTINGS = {
      
                                   "csrf": "I NEED THIS VALUE",
                                   "transId": "I ALSO NEED THIS VALUE",
                                  };
      
              </script>
      
              </head>
      
              <body>
              </body>
      
              </html>
          `
          var b =  html.parseHTML(res).find("script").text();
          console.log(b);
          var settings = eval(b + ";SETTINGS;");
          console.log(settings.csrf);
      }
      
      

      这样您就不需要知道值的确切位置,并且可以从中获得更多值...轻松;)。

      正如另一个回答提到的那样,这在负载测试脚本中可能不是一个好主意 - 尤其是负载测试部分 - 如果这在某些设置代码中可能没问题。

      注意:;SETTINGS; 是因为 eval 返回最后一个值,所以我们需要将 SETTINGS 放在最后 ;)

      或者,您可以编写一个辅助函数来完成 Aalok 手动执行的操作:

      export default function () {
          var res = `<html lang="en">
      
              <head>
                  <link rel="icon" href="data:;base64,iVBORw0KGgo=">
                  <script data-container="true" nonce="ekqlmSlKlpMlCSDxgP6erg==">
      
      
                      var SETTINGS = {
      
                                   "csrf": "I NEED THIS VALUE",
                                   "transId": "I ALSO NEED THIS VALUE",
                                  };
      
              </script>
      
              </head>
      
              <body>
              </body>
      
              </html>
          `
          console.log(getLabel(res, "csrf"));
          console.log(getLabel(res, "transId"));
      }
      
      function getLabel(content, label) {
          var start = content.indexOf('"'+label+'":') + label.length + 3;
          var nextComma = content.indexOf(',', start);
          var nextCurly = content.indexOf('}', start);
          var end = Math.min(nextComma,nextCurly);
          return content.substring(start,end)
      }
      

      您可能需要修剪一些空格或/和"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多