请看图片中,我用蓝色方框标记了两个按钮,正常使用是通过来回点击这两个按钮来刷新两个页面,可是我看到别人可以一直不点击而只刷新选中的按钮对应的页面。同时这两个按钮的clicked的值都是false,请问这是怎么实现的?

已存档
ltknnk6lvw · 2 个月前
第 1 条补充
·
2 个月前

用户正常使用是需要手动点击这两个按钮才会刷新的。那么我需要通过什么步骤才能也做到不点击另外一个按钮只刷新当前按钮呢?直接只点击一个按钮是不会刷新页面的。

第 2 条补充
·
2 个月前

通过系统广播触发刷新的代码是什么意思?我没太看懂

回答

Hamibot AI
1
· 2 个月前

根据你的描述,这两个按钮的clicked属性都为false,说明它们没有真正被点击。实现不点击按钮而刷新页面,可以通过以下方法:

  1. 观察页面内容变化:可能通过轮询或监听页面内容变化来触发刷新,而不是直接点击按钮。
  2. 模拟刷新逻辑:通过脚本直接访问页面刷新逻辑的底层函数或接口。
  3. 控制按钮状态:虽然按钮的clicked属性为false,但可以通过脚本控制其状态来触发刷新。

示例代码:

// 文档地址 https://docs.hamibot.com/
// 轮询检测页面变化并刷新
while (true) {
    if (checkPageChanged()) {
        refreshPage();
    }
    sleep(2000); // 2秒检测一次
}

function checkPageChanged() {
    // 检测页面变化的逻辑
    return false; // 替换为实际检测逻辑
}

function refreshPage() {
    // 刷新页面的逻辑
}
hamibot.exit();

如果上述方法不适用,你可以尝试以下方式:

  • 使用bounds()获取按钮坐标,通过click()Tap()模拟点击。
  • 检查页面是否有其他刷新机制(如滑动、长按等)。

如需进一步帮助,请提供更多页面或按钮的详细信息。


补充回答 1

要实现不点击另一个按钮也能刷新当前页面,你需要分析页面刷新逻辑并找到底层触发机制。以下是具体实现步骤:

1. 分析按钮行为

// 获取两个按钮对象
let btnA = className("Button").text("按钮A").findOne();
let btnB = className("Button").text("按钮B").findOne();

// 检查按钮属性
console.log("btnA clickable:", btnA.clickable());
console.log("btnB clickable:", btnB.clickable());

2. 尝试直接触发刷新(推荐方案)

// 文档地址 https://docs.hamibot.com/
// 方案1:通过系统广播触发刷新
shell("am broadcast -a com.example.REFRESH_ACTION", true);

// 方案2:调用页面内部方法(需反编译分析)
runtime.accessibility({
  action: "callMethod",
  packageName: "com.example.app",
  className: "com.example.MainActivity",
  methodName: "forceRefresh"
});

3. 模拟完整交互流程

// 如果必须保持按钮状态同步
function smartRefresh() {
  let currentBtn = className("Button").selected(true).findOne();
  let targetBtn = currentBtn.text() == "按钮A" ? btnB : btnA;
  
  targetBtn.click();
  sleep(300);
  currentBtn.click();
}

// 使用RootAutomator实现无痕点击(需要root)
let ra = new RootAutomator();
ra.tap(btnA.bounds().centerX(), btnA.bounds().centerY());
ra.tap(btnB.bounds().centerX(), btnB.bounds().centerY(), 100); // 100ms间隔
ra.close();

关键点说明:

  1. 查看抓取到的控件是否包含refresh/update相关方法
  2. 监控点击事件后的网络请求(使用Charles/Fiddler抓包)
  3. 检查是否依赖页面滑动距离等隐藏条件

如果仍然无法解决,建议:

  1. 提供layout bounds获取的控件层级信息
  2. 录制页面操作视频(含点击坐标提示)
  3. 检查是否依赖加速度传感器等物理设备信号

hamibot.exit();


注意:实际实现可能需要结合具体APP的内部机制,以上代码需要根据实际情况调整。优先推荐方案2通过分析应用内部机制实现静默刷新。

***

# 补充回答 2

系统广播触发刷新的方法是利用Android的广播机制,让APP内部接收特定指令后执行刷新操作。这个方法的原理和实现细节如下:

**实现原理**
1. 很多APP会注册广播接收器(BroadcastReceiver)来监听系统或应用自定义的广播
2. 当收到特定action的广播时,会触发刷新等预设操作
3. 通过adb/shell命令可以模拟发送这些广播

**具体代码解释**
```javascript
// 发送系统广播的基本格式
shell("am broadcast -a 广播动作名称 -e 额外参数", true);

// 实际示例:发送自定义刷新广播
shell("am broadcast -a com.example.app.ACTION_REFRESH -e type force", true);

实现步骤

  1. 先要确定目标APP的广播action名称(三种方法):
// 方法1:反编译APP查看AndroidManifest.xml
// 查找<receiver>标签中的<intent-filter>

// 方法2:监控logcat日志
// 在点击刷新按钮时观察APP输出的广播日志

// 方法3:尝试常见广播action
const commonActions = [
  "android.intent.action.TIME_SET",
  "com.example.app.REFRESH",
  ".action.RELOAD"
];
  1. 测试有效广播:
// 文档地址 https://docs.hamibot.com/
for(let action of commonActions) {
  toast("正在测试:" + action);
  shell("am broadcast -a " + action, true);
  sleep(2000);
}

注意事项

  1. 需要先在Hamibot脚本开头声明shell权限:
shell.setDefaultOptions({root: true});
  1. 部分APP需要附加参数才能触发:
// 带额外参数的广播示例
shell("am broadcast -a com.xxx.REFRESH --es source external", true);

完整示例代码

// 尝试发送新闻类APP常见的刷新广播
function tryRefresh() {
  let actions = [
    "android.net.conn.CONNECTIVITY_CHANGE",  // 网络变化
    "com.ss.android.article.news.intent.action.REFRESH",  // 今日头条
    "com.tencent.news.action.refresh"  // 腾讯新闻
  ];
  
  actions.forEach(action => {
    shell("am broadcast -a " + action, true);
    sleep(1000);
  });
}

tryRefresh();
hamibot.exit();

如果这个方法无效,说明该APP可能:

  1. 使用websocket长连接控制刷新
  2. 依赖手势滑动等UI交互
  3. 需要带签名的安全广播

这时就需要改用其他方法,比如:

// 通过无障碍服务模拟点击坐标
click(device.width/2, device.height/3);
// 或者使用root权限直接调用APP内部方法

建议先用以下命令查看APP是否注册了广播接收器:

// 查看已注册的广播接收器
shell("dumpsys package receivers | grep 应用包名", true);
ℹ️ 本回答由 AI 生成,内容仅供参考