input.setInputFiles上传失败因仅支持绝对路径或FilePayload,且需确保file input元素可见、启用;支持单路径、路径数组、FilePayload三种格式,动态文件推荐用FilePayload构造。
Playwright 的 input.setInputFiles 不会自动读取或上传远程路径、相对路径未解析、或权限受限的文件,它只接受绝对路径(或 FilePayload 对象),且目标 必须处于可交互状态(未被 display: none、visibility: hidden 或 disabled 禁用)。
常见错误现象:TimeoutError: Waiting for element to be visible, enabled and not moving 或静默失败无报错但后端收不到文

page.locator('input[type="file"]') 定位到真实 DOM 节点,而非父容器或 labelpage.click() 触发文件选择框——Playwright 不支持操作原生系统对话框path.resolve(__dirname, 'test.pdf')
element.setHidden(false) 或用 element.evaluate(el => el.style.display = 'block')
input.setInputFiles() 接收三种合法输入:
'/home/user/file.jpg'
['a.png', 'b.pdf']
FilePayload 对象(用于内存构造文件,绕过磁盘):{
name: 'report.csv',
mimeType: 'text/csv',
buffer: Buffer.from('id,name\n1,foo\n2,bar')
}注意:FilePayload.buffer 必须是 Buffer,不是 Uint8Array 或字符串;mimeType 若不填,Playwright 会基于扩展名推断,但上传 CSV、JSON 等无标准扩展名时建议显式指定。
测试中常需上传运行时生成的内容(如导出的 JSON、截图),这时不应依赖磁盘文件,而应直接构造 FilePayload:
const payload = {
name: 'export.json',
mimeType: 'application/json',
buffer: Buffer.from(JSON.stringify({ items: [1, 2, 3] }))
};
await page.locator('input[type="file"]').setInputFiles(payload);
这种写法跳过了文件 I/O,更快更稳定;但如果后端校验文件大小或哈希,需确保 buffer.length 符合预期。另外,多个 setInputFiles 调用会覆盖前一次值(不是追加),如需“添加”文件,必须一次性传入完整数组。
绝大多数场景下行为一致,但有两个关键区别:
input[type="file"] 元素调用 focus() 或 press(),所以不要在 setInputFiles 前加这些操作.txt 被当成 text/plain,而服务端要求 text/x-markdown),此时必须显式传 FilePayload 并指定 mimeType
跨浏览器测试时,优先用 FilePayload 格式,能最大程度规避路径解析和 MIME 推断差异。