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

如何在Playwright中断言multipart/form-data请求的FormData?

验证Playwright中multipart/form-data请求的有效负载

你遇到的问题核心是:postData()返回的是序列化后的multipart表单字符串(包含随机生成的boundary分隔符),而你用new FormData()创建的是浏览器原生的FormData对象,两者类型和结构完全不匹配,因此直接用toEqual断言会失败。

以下是两种可靠的解决方案:

方法1:使用Playwright内置的formData()方法解析请求体

Playwright的Request对象提供了formData()方法,能自动将multipart/form-data格式的请求体解析为FormData对象,之后你可以将其转换为普通对象或直接验证指定字段:

const requestPromise = page.waitForRequest('**/endpoint');
await helpers.clickButtonByName('Submit');
const request = await requestPromise;

// 解析请求体为FormData对象
const submittedFormData = await request.formData();

// 方式A:转换为普通对象后断言
const expectedData = { test: 'something' };
const formDataObj = Object.fromEntries(submittedFormData.entries());
expect(formDataObj).toEqual(expectedData);

// 方式B:直接验证单个字段(更灵活,适合多字段场景)
expect(submittedFormData.get('test')).toBe('something');

方法2:手动序列化预期FormData并忽略boundary对比

如果你需要对比原始请求体字符串,可以手动将预期的FormData序列化为multipart格式,再忽略随机boundary的差异进行匹配:

const requestPromise = page.waitForRequest('**/endpoint');
await helpers.clickButtonByName('Submit');
const request = await requestPromise;
const rawPostData = await request.postData();

// 创建预期FormData并手动序列化
const expectedForm = new FormData();
expectedForm.append('test', 'something');

// 将预期FormData转换为blob并读取为字符串
const expectedBlob = await new Response(expectedForm).blob();
const expectedRawData = await expectedBlob.text();

// 提取两边的核心内容(忽略boundary差异)
const extractContent = (str) => str.split('\r\n').filter(line => !line.startsWith('--') && line.trim() !== '').join('\r\n');
expect(extractContent(rawPostData)).toEqual(extractContent(expectedRawData));

推荐使用方法1,因为Playwright内置的解析逻辑更可靠,无需处理boundary的随机生成问题,代码也更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:15:55