在Puppeteer中复用重复代码:传入选择器的可复用函数实现
解决方案:封装可复用的Puppeteer成就完成函数
这问题太典型了——把重复的异步逻辑封装成函数,不仅能减少代码冗余,后续维护起来也方便太多!
核心思路就是把变化的部分(目标选择器)作为参数传入,把固定的4行异步操作放进一个异步函数里。具体实现如下:
1. 定义可复用函数
首先创建一个异步函数,接收Puppeteer的page对象和目标选择器作为必填参数,把你那4行重复逻辑放进去:
// 封装通用的成就完成逻辑 async function completeAchievement(page, targetSelector) { // 等待目标元素出现 await page.waitForSelector(targetSelector); // 点击目标元素 await page.click(targetSelector, { delay: 500 }); // 点击完成成就按钮 await page.click(COMPLETE_ACHIEVEMENT, { delay: 500 }); // 点击确认完成按钮 await page.click(CONFIRM_COMPLETE, { delay: 500 }); }
2. 在模块中调用函数
原来每个模块里的4行代码,现在只需要一行调用即可,把对应的选择器传进去:
// 社区提问成就模块调用 await completeAchievement(page, ACHIEVEMENTS.community_ask_question_id); // 其他成就模块调用(比如社区回答问题) await completeAchievement(page, ACHIEVEMENTS.community_answer_question_id);
3. 进阶优化:支持可选参数(可选)
如果后续遇到某些模块的COMPLETE_ACHIEVEMENT或CONFIRM_COMPLETE选择器不同,可以把这两个也设为可选参数,让函数更灵活:
async function completeAchievement( page, targetSelector, completeBtn = COMPLETE_ACHIEVEMENT, confirmBtn = CONFIRM_COMPLETE ) { await page.waitForSelector(targetSelector); await page.click(targetSelector, { delay: 500 }); await page.click(completeBtn, { delay: 500 }); await page.click(confirmBtn, { delay: 500 }); } // 特殊模块调用(自定义完成/确认按钮) await completeAchievement( page, ACHIEVEMENTS.special_achievement_id, SPECIAL_COMPLETE_BTN, SPECIAL_CONFIRM_BTN );
注意事项
- 因为函数是异步的,调用时必须加
await,否则会导致Promise未处理,逻辑执行顺序混乱。 - 确保
page对象在调用时是有效的(已初始化且未关闭)。
内容的提问来源于stack exchange,提问作者hangloos
相关产品推荐
相关产品推荐

