k6 负载测试 - 如何从 HTML 响应中提取值

k6 Load Testing - How extract value from HTML response

我是第一次使用 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 然后搜索子字符串来完成。这是最好的方法吗?

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

  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值。

因为在这种情况下你有 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 returns 最后一个值所以我们需要把 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)
}

您可能需要 trim 一些空格 or/and "