使用Python+Playwright上传1GB以上文件到测试网站出现溢出错误如何解决
问题原因
该OverflowError属于Playwright旧版本的已知传输层限制:底层和浏览器通信的消息使用4字节无符号整数存储payload长度,理论最大支持4GB的单条消息,加上序列化过程的额外开销,实际单文件超过1GB就可能触发整数溢出报错。你使用的set_files方法默认会把文件全量读入内存序列化后再传输给浏览器,刚好触发了这个限制。
解决方案
方案1:升级Playwright到最新稳定版(优先推荐)
官方在1.27及后续版本优化了大文件上传逻辑,底层实现了分块传输处理,无需修改业务代码即可直接支持GB级文件上传。
执行以下命令完成升级:
pip install --upgrade playwright # 升级后同步更新对应版本的浏览器驱动 playwright install
升级完成后直接运行你原本的代码即可正常完成上传。
方案2:JS注入绕过传输限制(适配无法升级版本的场景)
如果你的运行环境受限制无法升级Playwright版本,可以直接通过执行JS操作页面原生上传逻辑,让浏览器自主读取文件,不走Playwright的文件序列化传输流程,自然不会触发传输层大小限制:
page.evaluate("""(filePath) => { // 定位页面上传input元素 const uploadInput = document.querySelector('input[type="file"]'); // 构造文件对象触发上传事件 const dataTransfer = new DataTransfer(); dataTransfer.items.add(new File([], filePath)); uploadInput.files = dataTransfer.files; // 触发change事件执行业务上传逻辑 uploadInput.dispatchEvent(new Event('change', {bubbles: true})); }""", "/path/to/a/file")
如果页面的上传input默认是隐藏状态,可以先修改可见性再执行上述逻辑:
# 先解除input的隐藏状态 page.evaluate("""document.querySelector('input[type="file"]').style.display = 'block'""") # 再执行上传逻辑 page.evaluate("""(filePath) => { const uploadInput = document.querySelector('input[type="file"]'); const dataTransfer = new DataTransfer(); dataTransfer.items.add(new File([], filePath)); uploadInput.files = dataTransfer.files; uploadInput.dispatchEvent(new Event('change', {bubbles: true})); }""", "/path/to/a/file")
内容的提问来源于stack exchange,提问作者BogdanG
相关产品推荐
相关产品推荐

