菜单
文档面包屑箭头 Grafana k6面包屑箭头 使用 k6 浏览器
开源 RSS

使用 k6 浏览器

浏览器模块为 k6 带来了浏览器自动化和端到端 Web 测试功能,同时支持 k6 的核心特性。它添加了浏览器级别的 API,用于与浏览器交互,并在 k6 测试中收集前端性能指标。

此模块旨在提供与 Playwright API 的大致兼容性,因此您无需学习一个全新的 API。

注意

要使用浏览器模块,请确保您使用的是最新的 k6 版本,并在您的机器上安装一个基于 Chromium 的浏览器(例如 Google Chrome)。

观看下方视频,了解更多关于 k6 浏览器的信息。

浏览器测试用例

浏览器模块的主要用例是在浏览器层面测试性能。浏览器级别测试提供了一种衡量用户体验并发现协议层面难以捕捉的问题的方法。浏览器级别测试可以帮助您回答以下问题:

  • 当我的应用程序从协议层面接收到数千个并发请求时,前端会发生什么?
  • 我如何获取特定于浏览器的指标,例如总页面加载时间?
  • 前端上的所有元素都具有交互性吗?
  • 有没有加载转圈会持续很长时间才消失?

一个简单的浏览器测试

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

export const options = {
  scenarios: {
    ui: {
      executor: 'shared-iterations',
      options: {
        browser: {
          type: 'chromium',
        },
      },
    },
  },
  thresholds: {
    checks: ['rate==1.0'],
  },
};

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

  try {
    await page.goto('https://test.k6.io/my_messages.php');

    await page.locator('input[name="login"]').type('admin');
    await page.locator('input[name="password"]').type('123');

    await Promise.all([page.waitForNavigation(), page.locator('input[type="submit"]').click()]);

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

前面的代码启动一个基于 Chromium 的浏览器,访问应用程序并模拟用户登录应用程序。提交后,它检查标头文本是否与预期匹配。

运行测试后,将报告以下浏览器指标

bash
         /\      Grafana   /‾‾/
    /\  /  \     |\  __   /  /
   /  \/    \    | |/ /  /   ‾‾\
  /          \   |   (  |  (‾)  |
 / __________ \  |_|\_\  \_____/

  execution: local
     script: test.js
     output: -

  scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)


running (00m01.3s), 0/1 VUs, 1 complete and 0 interrupted iterations
ui   ✓ [======================================] 1 VUs  00m01.3s/10m0s  1/1 shared iters

     ✓ header

     browser_data_received.......: 2.6 kB  2.0 kB/s
     browser_data_sent...........: 1.9 kB  1.5 kB/s
     browser_http_req_duration...: avg=215.4ms  min=124.9ms med=126.65ms max=394.64ms p(90)=341.04ms p(95)=367.84ms
     browser_http_req_failed.....: 0.00%   ✓ 0        ✗ 3
     browser_web_vital_cls.......: avg=0        min=0       med=0        max=0        p(90)=0        p(95)=0
     browser_web_vital_fcp.......: avg=344.15ms min=269.2ms med=344.15ms max=419.1ms  p(90)=404.11ms p(95)=411.6ms
     browser_web_vital_fid.......: avg=200µs    min=200µs   med=200µs    max=200µs    p(90)=200µs    p(95)=200µs
     browser_web_vital_inp.......: avg=8ms      min=8ms     med=8ms      max=8ms      p(90)=8ms      p(95)=8ms
     browser_web_vital_lcp.......: avg=419.1ms  min=419.1ms med=419.1ms  max=419.1ms  p(90)=419.1ms  p(95)=419.1ms
     browser_web_vital_ttfb......: avg=322.4ms  min=251ms   med=322.4ms  max=393.8ms  p(90)=379.52ms p(95)=386.66ms
   ✓ checks......................: 100.00% ✓ 1        ✗ 0
     data_received...............: 0 B     0 B/s
     data_sent...................: 0 B     0 B/s
     iteration_duration..........: avg=1.28s    min=1.28s   med=1.28s    max=1.28s    p(90)=1.28s    p(95)=1.28s
     iterations..................: 1       0.777541/s
     vus.........................: 1       min=1      max=1
     vus_max.....................: 1       min=1      max=1

这通过 Web Vitals 以及来自浏览器的 HTTP 请求,提供了浏览器性能的表现。