You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Playwright codegen能否录制全量网络流量并回放测试用例?

Playwright Codegen 录制网络请求响应并回放方案

虽然Playwright Codegen本身没有内置的网络流量录制回放功能,但可以通过自定义脚本结合请求拦截来实现需求,以下是具体步骤:

一、录制页面所有网络请求与响应

创建一个自定义录制脚本,在启动浏览器的同时拦截并记录所有请求和响应:

const { chromium } = require('playwright');
const fs = require('fs');

(async () => {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();

  const networkLogs = [];

  // 捕获请求详情
  page.on('request', request => {
    networkLogs.push({
      type: 'request',
      method: request.method(),
      url: request.url(),
      headers: request.headers(),
      postData: request.postData(),
      timestamp: request.timestamp()
    });
  });

  // 捕获响应详情
  page.on('response', async response => {
    const req = response.request();
    let resBody;
    try {
      // 读取文本响应
      resBody = await response.text();
    } catch (err) {
      // 处理二进制资源(如图片、视频),转base64存储
      resBody = `[base64]${(await response.body()).toString('base64')}`;
    }

    networkLogs.push({
      type: 'response',
      url: response.url(),
      status: response.status(),
      headers: response.headers(),
      body: resBody,
      requestKey: `${req.method()}::${req.url()}`,
      timestamp: response.timestamp()
    });
  });

  // 打开目标页面,等待用户操作后关闭浏览器
  await page.goto('https://你的目标页面.com');
  console.log('开始录制,请操作页面,完成后关闭浏览器窗口');
  await browser.waitForEvent('close');

  // 保存日志到本地文件
  fs.writeFileSync('network-recording.json', JSON.stringify(networkLogs, null, 2));
  console.log('网络录制日志已保存至 network-recording.json');
})();

运行脚本:

node record-network.js

操作页面完成后关闭浏览器,即可得到包含所有请求响应的JSON文件。

二、利用录制的流量回放测试用例

编写回放脚本,通过路由拦截将页面请求替换为录制好的响应:

const { chromium } = require('playwright');
const fs = require('fs');

(async () => {
  // 读取录制的网络日志
  const recording = JSON.parse(fs.readFileSync('network-recording.json', 'utf8'));
  // 构建请求-响应映射表
  const responseMap = new Map();
  recording.forEach(item => {
    if (item.type === 'response') {
      responseMap.set(item.requestKey, item);
    }
  });

  const browser = await chromium.launch();
  const context = await browser.newContext();
  const page = await context.newPage();

  // 拦截所有请求,返回录制的响应
  await page.route('**/*', async route => {
    const req = route.request();
    const key = `${req.method()}::${req.url()}`;
    const cachedRes = responseMap.get(key);

    if (cachedRes) {
      // 解析二进制响应
      const body = cachedRes.body.startsWith('[base64]') 
        ? Buffer.from(cachedRes.body.slice(8), 'base64') 
        : cachedRes.body;

      await route.fulfill({
        status: cachedRes.status,
        headers: cachedRes.headers,
        body: body
      });
    } else {
      // 无录制记录时允许正常请求
      await route.continue();
    }
  });

  // 执行测试逻辑
  await page.goto('https://你的目标页面.com');
  // 示例断言:验证页面标题
  const pageTitle = await page.title();
  console.log('页面标题:', pageTitle);
  // 可添加更多断言逻辑

  await browser.close();
})();

运行回放脚本:

node replay-network.js

注意事项

  • 对于带动态参数的请求(如含时间戳、随机ID的URL),需要调整requestKey的生成规则,确保能匹配到对应的响应。
  • 敏感数据(如token、密码)会被记录在日志中,回放前建议清理或加密。
  • 部分网站会通过签名校验请求,这种情况下回放可能失败,需要额外处理请求签名逻辑。

内容的提问来源于stack exchange,提问作者Seol Cheung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:12:47