// 设置购买数量
function setQuantity() {
if (purchaseConfig.quantity <= 1) {
return; // 如果数量是1,不需要操作
}
log("设置购买数量:" + purchaseConfig.quantity);
sleep(200);
// 获取当前数量作为基准
let beforeQuantity = getCurrentQuantity();
if (beforeQuantity === null) {
log("❌ 无法获取当前数量,跳过数量设置");
return;
}
log("当前数量:" + beforeQuantity);
// 需要点击的次数
let clicksNeeded = purchaseConfig.quantity - beforeQuantity;
if (clicksNeeded <= 0) {
log("当前数量已满足要求,无需调整");
return;
}
// 设置重试次数和超时时间
let retryCount = 0;
const maxRetries = 10;
const clickInterval = 200;
while (retryCount < maxRetries && beforeQuantity < purchaseConfig.quantity) {
retryCount++;
log("第 " + retryCount + " 次尝试增加数量...");
// 查找+号按钮(Image类型)
let plusBtn = className("android.widget.Image").findOne(1);
if (!plusBtn) {
log("未找到Image类型的按钮,等待后重试");
sleep(100);
continue;
}
try {
// 获取按钮位置
let bounds = plusBtn.bounds();
log("找到按钮,位置:" + JSON.stringify(bounds));
// 点击按钮中心位置
let x = Math.floor((bounds.left + bounds.right) / 2);
let y = Math.floor((bounds.top + bounds.bottom) / 2);
// 使用press长按而不是click
press(x, y, 150);
// 等待并检查数量是否变化
sleep(clickInterval);
let currentQuantity = getCurrentQuantity();
if (currentQuantity > beforeQuantity) {
log("✅ 数量增加成功:" + beforeQuantity + " -> " + currentQuantity);
beforeQuantity = currentQuantity;
if (currentQuantity >= purchaseConfig.quantity) {
break;
}
// 成功后重置重试计数
retryCount = 0;
} else {
// 如果点击中心位置失败,尝试周围的点
log("中心点击未生效,尝试周围位置");
let offsets = [
{x: -3, y: 0}, {x: 3, y: 0},
{x: 0, y: -3}, {x: 0, y: 3},
{x: -3, y: -3}, {x: 3, y: 3},
{x: 3, y: -3}, {x: -3, y: 3}
];
for (let offset of offsets) {
if (beforeQuantity >= purchaseConfig.quantity) break;
press(x + offset.x, y + offset.y, 150);
sleep(clickInterval);
currentQuantity = getCurrentQuantity();
if (currentQuantity > beforeQuantity) {
log("✅ 偏移点击成功:" + beforeQuantity + " -> " + currentQuantity);
beforeQuantity = currentQuantity;
break;
}
}
}
} catch (e) {
log("点击尝试出错: " + e);
}
if (beforeQuantity < purchaseConfig.quantity) {
log("本次尝试未完全成功,等待后重试");
sleep(100);
}
}
// 最终验证
let finalQuantity = getCurrentQuantity();
if (finalQuantity === purchaseConfig.quantity) {
log("✅ 数量设置成功,当前数量:" + finalQuantity);
} else {
log("⚠️ 数量设置可能不完整,当前数量:" + finalQuantity + ",目标数量:" + purchaseConfig.quantity);
}
}
为什么无法点击 + 按钮,要用hamibot什么特殊的语法吗
回答
在 Hamibot 中实现控件点击操作时,确实需要注意几个关键点来确保操作成功。以下是对你的问题的分析与解决方案:
1. 控件定位准确性
你使用了 className("android.widget.Image")
来查找 +
按钮,但实际控件可能是 Button
类型或其他类型。建议使用更具体的选择器来定位控件,比如结合 text
或 desc
(描述)属性。
✅ 示例:使用更精确的控件定位方式
let plusBtn = className("android.widget.Button").text("+").findOne(1000);
if (!plusBtn) {
log("未找到 + 按钮");
return;
}
2. 点击操作的正确方式
在 Hamibot 中,press(x, y, duration)
通常用于模拟“长按”操作,而如果你只是想点击按钮,推荐使用 click(x, y)
方法,它更符合常规点击行为。
✅ 示例:使用 click
替代 press
let bounds = plusBtn.bounds();
let x = (bounds.left + bounds.right) / 2;
let y = (bounds.top + bounds.bottom) / 2;
click(x, y); // 普通点击
3. 权限检查
确保你的脚本已经获得了必要的权限,特别是无障碍服务和屏幕截图权限。如果未获取权限,某些控件将无法正确识别或操作。
✅ 示例:在脚本开头添加权限检查
auto.waitFor();
if (!requestScreenCapture()) {
toastLog("需要授予屏幕截图权限");
hamibot.exit();
}
4. 控件状态检查与等待
在某些情况下,控件可能尚未加载完成,或被其他元素遮挡。可以使用 waitFor()
等方法确保控件可见后再进行操作。
✅ 示例:使用 waitFor()
等待控件出现
let plusBtn = className("android.widget.Button").text("+").waitFor();
5. 日志与调试
建议在脚本中添加日志输出,帮助定位问题是否出在控件识别或点击操作上。
✅ 示例:增强日志输出
log("尝试查找 + 按钮");
let plusBtn = className("android.widget.Button").text("+").findOne(1000);
if (plusBtn) {
log("找到按钮,准备点击");
let bounds = plusBtn.bounds();
let x = (bounds.left + bounds.right) / 2;
let y = (bounds.top + bounds.bottom) / 2;
click(x, y);
log("按钮点击完成");
} else {
log("未找到 + 按钮");
}
6. 总结建议
问题点 | 建议 |
---|---|
控件类型不明确 | 使用 text 、desc 等属性精确定位 |
操作方式不匹配 | 优先使用 click(x, y) 实现点击 |
权限未获取 | 检查无障碍服务和截图权限 |
控件未加载完成 | 使用 waitFor() 或增加等待时间 |
缺乏调试信息 | 添加日志输出,确认控件状态 |
最终改进代码示例
auto.waitFor();
if (!requestScreenCapture()) {
toastLog("需要授予屏幕截图权限");
hamibot.exit();
}
function setQuantity() {
if (purchaseConfig.quantity <= 1) {
return;
}
log("设置购买数量:" + purchaseConfig.quantity);
let beforeQuantity = getCurrentQuantity();
if (beforeQuantity === null) {
log("❌ 无法获取当前数量,跳过数量设置");
return;
}
let clicksNeeded = purchaseConfig.quantity - beforeQuantity;
if (clicksNeeded <= 0) {
log("当前数量已满足要求,无需调整");
return;
}
log("尝试查找 + 按钮");
let plusBtn = className("android.widget.Button").text("+").waitFor();
if (!plusBtn) {
log("未找到 + 按钮");
return;
}
let bounds = plusBtn.bounds();
let x = (bounds.left + bounds.right) / 2;
let y = (bounds.top + bounds.bottom) / 2;
for (let i = 0; i < clicksNeeded; i++) {
click(x, y);
sleep(200);
let currentQuantity = getCurrentQuantity();
if (currentQuantity > beforeQuantity)
ℹ️ 本回答由 AI 生成,内容仅供参考