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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:36