如何在检测Coin Drop的循环中仅点击页面元素一次?
解决方案
核心问题修复
你的问题根源在于每次检测到可领取的Coin Drop时,循环会遍历所有符合条件的元素并重复点击弹窗,导致弹窗被频繁关闭/打开,打断后续的领取按钮点击。我们需要修改逻辑,找到第一个可领取项后仅打开一次弹窗,然后专注重复点击领取按钮,直到领取完成。
修改后的代码如下:
// 全局状态:区分当前是检测阶段还是领取阶段 let isClaiming = false; function checkForCoinDrop() { if (isClaiming) return; // 如果正在领取,跳过检测 const coinDropElements = document.getElementsByClassName("coindrop-status"); // 从后往前找第一个可领取的元素 for (let i = coinDropElements.length - 1; i >= 0; i--) { const element = coinDropElements[i]; if (element.innerText.trim() === "Grab") { isClaiming = true; // 标记进入领取状态 element.click(); // 仅点击一次打开弹窗 // 启动领取循环 startClaimingLoop(); return; // 找到第一个后立即退出循环,避免重复点击 } } } function startClaimingLoop() { // 点击领取按钮(保留你原来的坐标点击,建议后续替换为元素选择器) function clickClaimButton() { try { document.elementFromPoint(1250, 840).click(); } catch (e) { // 如果点击失败(比如弹窗已关闭),退出领取状态,回到检测 isClaiming = false; return; } // 检查是否还在领取状态,继续重复点击 if (isClaiming) { setTimeout(clickClaimButton, 500); // 缩短间隔,提高领取成功率 } } // 等待弹窗加载完成后开始点击 setTimeout(clickClaimButton, 1000); } // 启动检测轮询 setInterval(checkForCoinDrop, 800);
关键改进点
- 状态锁
isClaiming:防止检测和领取流程同时执行,避免重复打开弹窗 - 找到目标后立即退出循环:确保只打开一次弹窗
- 分离检测与领取逻辑:代码更清晰,便于维护
- 错误捕获:如果领取按钮点击失败(比如弹窗消失),自动回到检测状态
额外优化建议
替换坐标点击为元素选择器
坐标点击依赖窗口尺寸,很不稳定。建议用弹窗内领取按钮的类名/ID来定位,比如:// 示例:假设领取按钮类名为"coin-claim-btn" const claimBtn = document.querySelector(".coin-claim-btn"); if (claimBtn) claimBtn.click();用MutationObserver代替轮询
轮询会持续占用资源,用MutationObserver监听页面元素变化,只有当coindrop-status元素变化时才触发检测,更高效:const observer = new MutationObserver(() => { checkForCoinDrop(); }); // 监听body下的元素变化(可根据实际情况缩小监听范围) observer.observe(document.body, { childList: true, subtree: true });避免全局变量
可以用IIFE(立即执行函数表达式)封装代码,避免污染全局作用域:(function() { let isClaiming = false; // 这里放checkForCoinDrop和startClaimingLoop函数 setInterval(checkForCoinDrop, 800); })();添加日志便于调试
因为Coin Drop出现频率低,添加日志可以帮助你确认脚本执行状态:console.log("检测到可领取的Coin Drop,打开弹窗"); console.log("正在重复点击领取按钮..."); console.log("领取完成,回到检测状态");
内容的提问来源于stack exchange,提问作者AuspiciousSilver34
相关产品推荐
相关产品推荐

