// 文档地址:https://docs.hamibot.com/

// 新增功能:获取页面中的所有文本信息
// 修改说明:在launch后增加等待逻辑,确保获取目标APP页面文本而非Hamibot界面

// 方法二:通过包名
if (launch("com.ZlBeM.gyL6X")) {
toast("打开成功");

// 等待目标APP成为前台
try {
waitForPackage("com.ZlBeM.gyL6X");
// 等待页面完全加载
sleep(2000);
toast("页面加载完成,开始获取文本");
} catch (e) {
toast("等待APP启动超时:" + e.message);
exit();
}
} else {
toast("打开失败");
exit();
}
我希望打开应用之后,获取应用界面的所有文字应该怎么做

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

那我应该怎么看到所有文字内容呢? 好像在应用界面也没有显示出来

回答

Hamibot AI
1
· 2 个月前

文档地址:https://docs.hamibot.com/

要获取应用界面中的所有文字,你可以结合 launchwaitForPackage 来确保目标应用已经启动并处于前台状态。接着可以使用 Hamibot 提供的 UI 查找功能来获取界面上的所有文本信息。

以下是完整示例代码:

// 方法二:通过包名启动应用并获取界面文本
if (launch("com.ZlBeM.gyL6X")) {
  toast("打开成功");

  // 等待目标APP成为前台
  try {
    waitForPackage("com.ZlBeM.gyL6X");
    // 等待页面完全加载
    sleep(2000);
    toast("页面加载完成,开始获取文本");
    
    // 获取当前界面中所有的文本信息
    var texts = className("TextView").find();
    if (texts && texts.length > 0) {
      for (var i = 0; i < texts.length; i++) {
        log(texts[i].text());
      }
    } else {
      toast("未找到任何文本内容");
    }
    
  } catch (e) {
    toast("等待APP启动超时:" + e.message);
    exit();
  }
} else {
  toast("打开失败");
  exit();
}

解释:

  1. launch("com.ZlBeM.gyL6X") 启动指定包名的应用。
  2. waitForPackage("com.ZlBeM.gyL6X") 确保该应用处于前台。
  3. sleep(2000) 给应用一定时间加载界面。
  4. className("TextView").find() 查找当前界面中所有 TextView 控件(通常是显示文本的地方)。
  5. 遍历输出每个 TextView 的文本内容。

请根据你的实际需求调整控件类型或选择器条件。


补充回答 1

文档地址:https://docs.hamibot.com/

如果你在应用界面没有看到任何文本输出,可能是由于以下原因:

1. 确认获取的控件是否在屏幕上可见

有些 TextView 控件可能被设置为 不可见(gone / invisible) 或者位于屏幕之外(超出可视区域),你可以添加过滤条件来确保只获取屏幕上可见的控件:

var texts = className("TextView").visibleToUser(true).find();

这样可以过滤掉不在屏幕可视范围内的控件。

2. 查看日志输出

你当前使用的 log() 函数会将内容输出到 Hamibot 的日志系统中。要查看这些日志,请:

  • 打开 Hamibot 应用;
  • 进入“运行日志”页面;
  • 查看你的脚本执行过程中输出的内容。

3. 使用 toast() 显示部分结果

由于日志信息较多时可能不易查看,建议你先限制输出数量,例如打印前几个文本内容:

for (var i = 0; i < Math.min(texts.length, 5); i++) {
  toast("文本内容:" + texts[i].text());
  sleep(1000); // 延迟显示,方便查看
}

4. 检查控件是否存在

有时候界面上可能并没有 TextView 控件,或者控件类型不同(比如 ButtonEditText 等也包含文本)。你可以尝试获取更多类型的控件:

var allTexts = [];
var textViews = className("TextView").find();
var buttons = className("Button").find();
var editTexts = className("EditText").find();

// 合并所有文本内容
function addTexts(arr) {
  for (var i = 0; i < arr.length; i++) {
    allTexts.push(arr[i].text());
  }
}

addTexts(textViews);
addTexts(buttons);
addTexts(editTexts);

// 输出去重后的文本内容
allTexts = uniqueArray(allTexts);
toast("共找到 " + allTexts.length + " 条不同文本");
log(allTexts.join("\n"));

// 辅助函数:数组去重
function uniqueArray(arr) {
  return arr.filter((value, index, self) => self.indexOf(value) === index);
}

5. 使用布局分析工具验证

Hamibot 提供了“布局分析”功能,可以实时查看当前界面的控件结构:

  • 在 Hamibot 主界面点击右上角 “≡” 菜单;
  • 选择 “布局分析”;
  • 切换到目标应用界面;
  • 查看界面上是否有文本控件以及它们的类名和属性。

总结

你现在需要做的步骤是:

  1. 添加 .visibleToUser(true) 过滤屏幕外控件;
  2. 使用 toast() 显示部分内容,确认是否获取成功;
  3. 查看 Hamibot 日志获取完整输出;
  4. 使用布局分析工具验证界面结构。

如果仍然无法获取内容,可能是该应用使用了自定义控件或绘制方式(如 Canvas 绘图),这种情况下 OCR 文字识别是一个替代方案。需要我提供 OCR 获取屏幕文字的方法吗?

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