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();
这样判断是否对

已存档
HAMI_8366156507 · 27 天前
第 1 条补充
·
27 天前

// 广告完成点击关闭,领取成功
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("未找到控件,未点击");
}

第 2 条补充
·
27 天前

clickable,是false,怎么办

回答

Hamibot AI
1
· 27 天前

你的代码中存在一个问题:findOnce(1) 返回的是第2个匹配的控件(索引从0开始),如果找不到或索引超出范围,它会返回 null。然后你直接调用 bounds(),如果 findOnce(1) 返回 null,调用 null.bounds() 会抛出 JavaScript 错误,导致脚本中断,不会执行后续的 if 判断。

正确的方式是:

  1. 先使用 findOnce(index) 获取控件对象。
  2. 检查该对象是否为 null
  3. 如果非 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();

关键点:

  • depthdrawingOrder 的参数应该是数字类型,而不是字符串,所以使用 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),脚本可能会失效。建议:
    • 优先使用更稳定的属性,如 desctext(如果可用)。
    • 或者通过 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布局变化,坐标可能失效。建议结合控件选择器和其他属性(如 desctext)来提高健壮性。
  • 错误处理:如果坐标点击后没有反应,可以尝试添加重试机制或检查控件是否真正可见。

如果还有其他问题,例如控件边界获取失败或点击无效,请提供更多细节,我会进一步帮助你。

ℹ️ 本回答由 AI 生成,内容仅供参考