Puppeteer的waitForFileChooser()无法检测Electron API唤起的文件选择器(超时)
Puppeteer测试Electron文件上传超时问题排查与解决
问题根源
Puppeteer的page.waitForFileChooser()只能监听浏览器原生文件选择弹窗(由<input type="file">标签触发的弹窗),但你用的是Electron内置的dialog.showOpenDialog——这是Electron提供的系统级弹窗,不属于浏览器原生文件选择器范畴,所以Puppeteer根本监听不到这个弹窗,自然会触发超时。
可行解决方案
直接调用暴露的API
既然前端已经通过preload拿到了openFiles方法,测试时不用模拟点击按钮触发弹窗,直接在Puppeteer里执行这个方法并传入测试文件路径即可:await page.evaluate(async () => { // 传入测试文件的绝对路径,确保Electron进程能访问到 await window.openFiles(['/Users/xxx/test/upload-file.txt']); });这种方式绕开了弹窗交互,直接调用核心逻辑,更适合自动化测试场景。
Mock Electron的Dialog方法
如果你的测试需要验证“点击按钮是否正确触发了Dialog调用”,可以在Electron的main进程中针对测试环境做Mock,直接返回预设结果,不用弹出真实弹窗:
在main.js中添加测试环境判断:const { dialog } = require('electron'); if (process.env.NODE_ENV === 'test') { const originalDialog = dialog.showOpenDialog; dialog.showOpenDialog = async () => { // 模拟用户选择了文件的返回结果 return { canceled: false, filePaths: ['/path/to/test/file.txt'] }; }; }启动Electron测试时设置环境变量
NODE_ENV=test,这样点击上传按钮触发openFiles时,会直接拿到预设的文件路径,Puppeteer也不会因为等待不存在的原生弹窗而超时。改用Electron专用测试工具(可选)
如果需要验证系统级弹窗的交互逻辑,Puppeteer的能力有限,建议使用Spectron(Electron官方推荐的测试框架),它可以直接控制Electron的各类API,包括Dialog的调用模拟。
内容的提问来源于stack exchange,提问作者Beast
相关产品推荐
相关产品推荐

