var tjb = className("android.view.ViewGroup").packageName("com.phoenix.read").depth("27").drawingOrder("4").findOnce(1).bounds();
if (tjb != null) {
log("点击了")
}else{
log("未点击")
}
sleep(50000)
hamibot.exit();
这样判断是否对
// 广告完成点击关闭,领取成功
var widget = className("android.widget.ImageView").packageName("com.phoenix.read").depth(10).drawingOrder(1).indexInParent(0).findOne(5000);
if (widget != null) {
var tjb = widget.bounds();
log("找到了控件关闭图标);
// 如果需要点击,可以添加:widget.click();
widget.click();
sleep(3000);
} else {
log("未找到控件,未点击");
}
clickable,是false,怎么办
回答
你的代码中存在一个问题:findOnce(1) 返回的是第2个匹配的控件(索引从0开始),如果找不到或索引超出范围,它会返回 null。然后你直接调用 bounds(),如果 findOnce(1) 返回 null,调用 null.bounds() 会抛出 JavaScript 错误,导致脚本中断,不会执行后续的 if 判断。
正确的方式是:
- 先使用
findOnce(index)获取控件对象。 - 检查该对象是否为
null。 - 如果非
null,再调用bounds()或其他方法。
另外,你的日志消息是“点击了”,但代码中并没有实际点击操作,这可能是个误解。如果你是想检查控件是否存在并点击它,应该使用 click() 方法。
以下是修正后的代码示例:
// 文档地址 https://docs.hamibot.com/
var widget = className("android.view.ViewGroup").packageName("com.phoenix.read").depth(27).drawingOrder(4).findOnce(1);
if (widget != null) {
var tjb = widget.bounds();
log("找到了控件,边界为: " + tjb);
// 如果需要点击,可以添加:widget.click();
log("点击了");
} else {
log("未找到控件,未点击");
}
sleep(50000);
hamibot.exit();
关键点:
depth和drawingOrder的参数应该是数字类型,而不是字符串,所以使用depth(27)和drawingOrder(4),而不是depth("27")和drawingOrder("4")。- 先获取控件对象,再检查是否为
null,然后操作。 - 如果你确实想点击控件,取消注释
widget.click()。
这样修改后,判断逻辑就正确了,不会因为 null 调用方法而报错。
补充回答 1
你的代码基本正确,但有一个小错误:在 log("找到了控件关闭图标); 这一行,字符串没有正确闭合,缺少一个双引号。这会导致语法错误,脚本无法运行。修正后应该是 log("找到了控件关闭图标");。
以下是修正后的代码,并附带一些优化建议:
// 文档地址 https://docs.hamibot.com/
// 广告完成点击关闭,领取成功
var widget = className("android.widget.ImageView").packageName("com.phoenix.read").depth(10).drawingOrder(1).indexInParent(0).findOne(5000);
if (widget != null) {
var tjb = widget.bounds();
log("找到了控件关闭图标");
widget.click(); // 直接点击控件
sleep(3000);
} else {
log("未找到控件,未点击");
}
代码说明:
- 选择器条件:你使用了
className("android.widget.ImageView")、packageName("com.phoenix.read")、depth(10)、drawingOrder(1)和indexInParent(0)的组合来定位控件。这很详细,但可能过于严格。如果应用更新导致控件属性变化(如 depth 或 drawingOrder),脚本可能会失效。建议:- 优先使用更稳定的属性,如
desc或text(如果可用)。 - 或者通过 Hamibot 的布局分析工具生成代码,确保选择器更健壮。
- 优先使用更稳定的属性,如
- 查找超时:
findOne(5000)会在5秒内等待控件出现,这是合理的。 - 点击操作:
widget.click()是正确的,前提是控件可点击(clickable属性为 true)。如果点击无效,可以尝试使用坐标点击(通过bounds()获取中心点)。 - 兼容性:代码没有使用箭头函数或默认参数,兼容 Rhino 1.7.15 引擎。
优化建议:
- 如果控件点击后没有反应,检查控件的
clickable属性是否为 true。如果不是,可能需要使用Tap(x, y)(需要 root 权限)或点击父控件。 - 考虑添加重试机制,例如使用循环多次查找控件,以提高可靠性。
如果遇到其他问题,请提供更多细节,我会进一步帮助您。
补充回答 2
如果控件的 clickable 属性为 false,直接调用 widget.click() 可能无法成功点击。在这种情况下,你可以使用坐标点击的方式,通过获取控件的边界(bounds)并计算中心点坐标,然后使用 click(x, y) 函数来模拟点击。这需要你的设备具有 root 权限或运行在 Android 7.0 及以上版本。
以下是修改后的代码示例,添加了坐标点击的逻辑:
// 文档地址 https://docs.hamibot.com/
// 广告完成点击关闭,领取成功
var widget = className("android.widget.ImageView").packageName("com.phoenix.read").depth(10).drawingOrder(1).indexInParent(0).findOne(5000);
if (widget != null) {
var bounds = widget.bounds();
log("找到了控件关闭图标,但 clickable 为 false,使用坐标点击");
// 计算中心点坐标
var centerX = (bounds.left + bounds.right) / 2;
var centerY = (bounds.top + bounds.bottom) / 2;
click(centerX, centerY); // 使用坐标点击
sleep(3000);
} else {
log("未找到控件,未点击");
}
注意事项:
- root 权限或 Android 版本:
click(x, y)函数需要 root 权限或 Android 7.0 以上才能正常工作。如果你的设备不满足这些条件,坐标点击可能无效。 - 屏幕分辨率适配:如果脚本在不同分辨率的设备上运行,建议在脚本开头使用
setScreenMetrics(width, height)设置设计时的屏幕分辨率,以实现自动坐标缩放。例如,如果你的脚本是针对 1080x1920 分辨率设计的,添加:这可以确保坐标点击在不同设备上准确无误。setScreenMetrics(1080, 1920); // 根据实际设计分辨率调整 - 可靠性:坐标点击依赖于控件位置固定。如果UI布局变化,坐标可能失效。建议结合控件选择器和其他属性(如
desc或text)来提高健壮性。 - 错误处理:如果坐标点击后没有反应,可以尝试添加重试机制或检查控件是否真正可见。
如果还有其他问题,例如控件边界获取失败或点击无效,请提供更多细节,我会进一步帮助你。