如何使用Puppeteer从指定目录上传随机图片并删除?解决fs.readdirSync报错
问题解决:Puppeteer随机上传图片并删除,修复
fs.readdirSync is not a function报错 报错原因
你碰到的fs.readdirSync is not a function错误,根源是两个核心问题:
- 未导入Node.js内置的
fs文件操作模块 - 没有定义
dir变量来指定你的图片目录路径
完整修正代码
结合你的需求(随机选图、上传后删除、触发元素为.om3e55n1),修正后的可运行代码如下:
// 导入必要模块 const puppeteer = require('puppeteer'); const fs = require('fs'); const path = require('path'); // 定义图片目录(用path模块处理Windows路径,避免转义错误) const dir = path.resolve('C:\\Users\\username\\Desktop\\mpimages'); // 随机选取数组元素 const pickRandom = (arr) => arr[Math.floor(Math.random() * arr.length)]; // 获取随机图片路径,过滤非图片文件 const getRandomImage = () => { const files = fs.readdirSync(dir).filter(file => ['.jpg', '.jpeg', '.png', '.gif'].includes(path.extname(file).toLowerCase()) ); if (files.length === 0) { throw new Error('图片目录为空,请检查路径或文件'); } return path.join(dir, pickRandom(files)); }; (async () => { let browser; try { browser = await puppeteer.launch({headless: false}); const page = await browser.newPage(); await page.goto("YOUR/UPLOAD/URL"); // 点击触发上传的div元素 await page.click('.om3e55n1'); // 等待并找到隐藏的文件上传input const fileInput = await page.waitForSelector('input[type=file]', {visible: false}); const targetFile = getRandomImage(); // 执行文件上传 await fileInput.uploadFile(targetFile); // 可选:等待上传完成(根据页面实际情况调整,比如等待成功提示) // await page.waitForSelector('.upload-success-indicator'); // 可选:点击提交按钮(如果页面需要手动提交) // await page.click("input[type=submit]"); // 上传完成后删除原文件 fs.unlinkSync(targetFile); console.log(`已删除上传文件:${targetFile}`); } catch (error) { console.error('操作出错:', error.message); } finally { // 确保浏览器正常关闭 if (browser) await browser.close(); } })();
关键修正说明
- 模块导入:添加
fs和path模块导入,path用于处理跨平台路径,避免Windows路径的转义问题。 - 路径处理:用
path.resolve和path.join处理路径,替代手动拼接,减少错误。 - 图片过滤:增加文件后缀过滤逻辑,确保只选取图片格式的文件。
- 异常处理:添加
try/catch/finally块,处理空目录、页面加载失败等异常场景,保证浏览器能正常关闭。 - 上传触发:先点击
.om3e55n1的div元素,再操作对应的隐藏文件input,适配网站的上传交互逻辑。
内容的提问来源于stack exchange,提问作者Dresden21
相关产品推荐
相关产品推荐

