4

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

4

2 回答 2

5

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

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

于 2020-07-26T15:53:05.023 回答
0

因为在这种情况下,您有 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)
}

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

于 2020-07-27T08:17:38.727 回答