You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer多文件上传时page.waitForFileChooser()后续调用超时问题

Puppeteer多输入框图片上传超时问题解决

问题场景

用Puppeteer开发时,遇到需要给不同输入框上传多张图片的需求。给每个输入框调用page.waitForFileChooser()方法,第一个输入框能正常完成上传,但后面的调用全都超时,报错:

TimeoutError: Waiting for FileChooser failed: 30000ms exceeded

初始代码

// 第一张图片上传
const [fileChooser] = await Promise.all([
    page.waitForFileChooser(),
    page.click('#inputOne'),
]);

await fileChooser.accept(['imageOne.jpg']);


// 第二张图片上传
const [fileChooserTwo] = await Promise.all([
    page.waitForFileChooser(),
    page.click('#inputTwo'),
]);

await fileChooserTwo.accept(['imageTwo.jpg']);

问题原因

推测是竞态条件导致:第一次上传完成后,页面DOM状态或事件队列还未稳定,此时立刻触发第二次文件选择器监听和点击操作,导致waitForFileChooser无法正确捕获到文件选择弹窗的触发事件。

修复后的代码

通过在触发点击前添加1秒等待,让页面状态稳定后再操作,解决了超时问题:

// 第一张图片上传
const [fileChooser] = await Promise.all([
    page.waitForFileChooser(),
    page.waitForTimeout(1000),
    page.click('#inputOne'),
]);

await fileChooser.accept(['imageOne.jpg']);


// 第二张图片上传
const [fileChooserTwo] = await Promise.all([
    page.waitForFileChooser(),
    page.waitForTimeout(1000),
    page.click('#inputTwo'),
]);

await fileChooserTwo.accept(['imageTwo.jpg']);

小提示:修复代码里Promise.all内部不需要给page.waitForTimeout和page.click加await,Promise.all会自动处理异步操作的并行等待,原代码里的await属于冗余写法,去掉后不影响效果且更规范。

内容的提问来源于stack exchange,提问作者A.Fonseca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:01:12