FEATURED · 精选文章

如何用 Puppeteer 自动上传本地文件到 input[type=file] 元素

发布时间 / 2026/9/9 22:00:33
来源 / 创域科博编辑部
栏目 / 资讯中心
如何用 Puppeteer 自动上传本地文件到 input[type=file] 元素 如何用 Puppeteer 自动上传本地文件到 input[typefile] 元素【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteerPuppeteer 官方文档明确说明文件上传需要定位到页面的文件输入元素然后调用ElementHandle.uploadFile()。也就是说不需要模拟操作系统层面的文件选择对话框直接把本地文件路径写进input typefile即可页面的input/change事件会被正常触发。本文基于仓库内文档docs/guides/files.md、docs/guides/page-interactions.md和 API 说明给出从启动浏览器到验证上传结果的完整操作路径。准备条件按 docs/guides/page-interactions.md 中展示的页面交互基本流程先启动浏览器并打开目标页面import puppeteer from puppeteer; const browser await puppeteer.launch(); const page await browser.newPage(); // 替换为你自己的页面地址 await page.goto(YOUR_SITE);文档示例中的YOUR_SITE是占位值需替换为包含文件上传控件的页面 URL。后续所有步骤都以这个page对象为基础。主路径waitForSelector uploadFile适用于文件输入框已经或即将出现在 DOM 中的场景。文档给出的标准写法是先用page.waitForSelector(input[typefile])拿到元素的ElementHandle再调用uploadFile()// 等待文件输入框出现 const fileElement await page.waitForSelector(input[typefile]); // 把本地文件设置为 input 的值 await fileElement.uploadFile([./path-to-local-file]);方法签名为uploadFile(...paths: string[]): Promisevoidpaths支持传入多个路径即一次给input设置多个文件。./path-to-local-file需要替换为脚本所在环境中真实存在的文件路径。路径参数的三条限制API 文档ElementHandle.uploadFile在 Remarks 中明确列出了三点直接决定了参数怎么传不会校验文件是否存在。如果本地文件路径写错方法不会提前报错input.files里会出现名为该文件名的空条目——验证时必须检查实际读到的内容见下一节。相对路径基于当前工作目录解析Node 的process.cwd()。脚本在别的目录启动时./开头的路径指向的位置可能和你预期不一致。本地脚本连接远程 Chrome 时路径必须是绝对路径。因为路径是在本地脚本所在机器上解析的相对路径无法到达浏览器侧的机器。验证上传是否成功仓库测试 test/src/input.test.ts 给出了官方测试中使用的验证方式上传后通过evaluate读取input.files确认文件名、类型和事件是否触发// 先拿到 input 句柄与上传用的是同一个 handle const input (await page.$(input[typefile]))!; await input.uploadFile(filePath); // 文档示例检查文件是否已写入 input const name await input.evaluate(e (e as HTMLInputElement).files?.[0]?.name); const type await input.evaluate(e (e as HTMLInputElement).files?.[0]?.type); // 期望name 为上传文件的文件名测试中是 file-to-upload.txt // type 为文件 MIME 类型测试中是 text/plain同一个测试还验证了uploadFile会按顺序触发input和change两个事件文档示例结果[input, change]页面依赖change事件发起上传请求的表单可以直接工作。测试里进一步用FileReader读取了文件内容说明浏览器侧能真正读到文件字节而不是只拿到文件名。可选分支input 不在 DOM 中时用 waitForFileChooser如果页面通过点击按钮动态创建input typefile用page.$()拿不到元素。此时改用 Page.waitForFileChooser() 拦截文件选择请求并用FileChooser.accept(paths)回应。文档示例const [fileChooser] await Promise.all([ page.waitForFileChooser(), page.click(#upload-file-button), // 触发文件选择的那个按钮 ]); await fileChooser.accept([/tmp/myfile.pdf]);这个分支有几个文档明确给出的边界waitForFileChooser()必须在文件选择框弹出前调用它不会返回当前已经打开的文件选择框所以要和触发点击的动作用Promise.all并发执行。在 headful有界面模式下调用该方法后原生文件对话框不会显示由accept()/cancel()代替人工选择。通过window.showOpenFilePicker等 DOM API 触发的文件选择对话框目前不支持拦截这种页面只能走主路径直接操作已存在的 input。浏览器同一时间只能打开一个文件选择框且每个FileChooser实例都必须accept()或 cancel()否则后续的文件选择框无法再出现见 FileChooser 类说明。accept()与uploadFile()一样不校验路径是否存在相对路径同样基于当前工作目录解析远程环境需绝对路径FileChooser.accept。收尾释放句柄docs/guides/page-interactions.md 在waitForSelector一节中提醒该方法是比 locator 更低层的 API返回的ElementHandle需要手动 dispose 以防止内存泄漏await fileElement.dispose(); await browser.close();ElementHandle会阻止对应 DOM 元素被垃圾回收除非显式 dispose页面导航或所属 context 被销毁时句柄才会自动释放。如果你的脚本只做一次上传就退出直接browser.close()收尾即可。小结两条路径怎么选input 元素在 DOM 中包括延迟出现、用选择器能定位到的waitForSelector/page.$()uploadFile([...paths])这是 docs/guides/files.md 给出的默认方式。input 不在 DOM 中、由按钮点击动态创建Promise.all([page.waitForFileChooser(), 触发动作])fileChooser.accept([...paths])注意它必须在动作之前挂起且不支持showOpenFilePicker类对话框。两条路径上传成功后都可以用evaluate读取input.files[0]的name/type/内容来确认结果。【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻