如何在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
相关产品推荐
相关产品推荐

