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 "
我是第一次使用 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 "