菜单
文档面包屑箭头 Grafana k6面包屑箭头 使用 k6 browser面包屑箭头 将浏览器脚本迁移到 k6 v0.52
开源

将浏览器脚本迁移到 k6 v0.52

本指南概述了将现有 k6 实验性浏览器测试脚本迁移到捆绑在 k6 0.52 中的 最新 k6 浏览器模块版本时需要进行的主要更改。

主要变更

在 k6 的最新版本中,我们将 k6 浏览器模块从实验性阶段毕业,现在它位于导入路径 k6/browser 下。迁移到这个模块是一个破坏性更改,将影响使用实验性 k6 浏览器模块的 所有脚本。这些破坏性更改包括:

  1. 将大多数 k6 浏览器模块 API 转换为了异步 (async) API。这意味着它们将返回一个 promise,该 promise 在 API 调用成功时将 resolve 为一个值,或在发生错误时 reject
  2. 进行此异步更改的一个副作用是,您需要使用 jslib.k6.io 中的 check 工具函数,而不是使用 k6 的 check API。
  3. 最后,值得重申的是,group API 仍然不适用于异步 API。

如果您对此次更改背后的原理感兴趣,请参阅 v0.51 发布说明

注意

实验性导入 (k6/experimental/browser) 及相应的同步 API 将支持到 2024 年 9 月 23 日。

迁移到异步

为确保您的脚本在最新版本的 k6 浏览器模块中正常工作,您必须:

  1. 将导入路径从 k6/experimental/browser 更改为 k6/browser
  2. 确保所有已迁移到异步的同步 (sync) API 都得到适当处理。在大多数情况下,您只需要在 API 调用前面添加 await

例如,之前

JavaScript
import { browser } from 'k6/experimental/browser';

...

export default async function () {
    const page = browser.newPage();
    ...
}

现在

JavaScript
import { browser } from 'k6/browser';

...

export default async function () {
    const page = await browser.newPage();
    ...
}

在使用浏览器模块时,您可能已经遇到过异步 API,例如 page.click,因此 asyncawait 关键字的使用对您来说可能并不陌生。

下面是 v0.51v0.52 中通用浏览器测试的比较截图,以帮助您可视化此更改:

v0.51 & v0.52 script comparison

受影响的 API

使用 k6 check

k6 的 check API 不会 await promises,因此在其中一个谓词内调用返回 Promise 的函数(例如 locator.textContent())将不起作用。相反,您可以使用 jslib.k6.io 的 check 工具函数

例如,之前

JavaScript
check(page.locator('h2'), {
  header: lo => lo.textContent() == 'Welcome, admin!',
});

现在

JavaScript
import { check } from 'https://jslib.k6.io/k6-utils/1.5.0/index.js';

// ...

await check(page.locator('h2'), {
  'header': async lo => await lo.textContent() === 'Welcome, admin!'
});

Groups

关于 groups 的说明,它们也不适用于异步 API,目前还没有变通方案。您可以关注此 GitHub issue,以了解适用于异步 API 的 group API 的相关最新消息。

从 k6 v0.45 或更早版本迁移

如果您使用 k6 v0.45 或更早版本,请先查看 如何迁移到 v0.46。本指南详细介绍了 v0.46 中引入的针对 browser API 的破坏性更改,并提供了如何迁移到这些更改的说明。

在哪里获取额外帮助

随着 k6 v0.52 的发布,您还可以找到最新的类型定义以及 k6 浏览器文档 的更新。有关如何在项目中处理类型定义文件的详细信息,请参阅 配置 k6 IntelliSense

有关所有详细信息,请查阅 k6 0.52 版本 的 CHANGELOG。如果您需要帮助,也可以在社区论坛中提问。