Playwright 大文件上传
2025年11月12日·Hangzhou
Tech
摘要
项目中用 Playwright 实现了浏览器自动化操作,遇到了超过50M的文件无法上传的情况,一开始以为是浏览器CDP会话的限制,但是我切换用 Puppeteer 上传是可以的。一翻折腾后,发现依然没有成功。 于是换了个思路,去看 Playwright 的实现,还真找到了。上传的时候会报错 "Cannot transfer files larger than 50Mb to a browser not co-located with the server"
# 问题定位
在 Playwright 中上传文件是调用的 page.setInputFiles 方法,顺着这个方法找到方法对应的文件
TypeScript
源代码中,setInputFilePaths 调用了 prepareFilesForUpload, 然后会跳转到实现
内部会调用 filesExceedUploadLimit 方法判断文件大小
源代码文件位置:playwright/packages/playwright-core/src/server/fileUploadUtils.ts
TypeScript
# 解决办法
重写 playwright/packages/playwright-core/src/server/page.ts 中的 setInputFilePaths 方法,这些方法的底层实现都是 CDP Session。
核心思路是直接通过 CDP Session 上传文件,绕过 Playwright 内置的 50MB 限制。
TypeScript
# 总结
Playwright 对大文件上传有内置限制,通过 CDP Session 可以绕过,但需要注意 shadow DOM 的处理。为啥会有这个限制:这是 Playwright 的安全限制,防止远程浏览器大文件传输。
The End➜cd ~/top
