REST API 有什么作用
如何点击一个没有id,没有text,没有desc的控件
如何遍历点击父控件下的子控件
回答
Hamibot REST API 的主要作用是提供标准化的程序接口,允许外部系统通过 HTTPS 请求与 Hamibot 平台进行交互、集成和自动化管理。通过该接口,你可以远程管理资源、触发任务或查询状态,无需手动操作控制台。
其核心技术特性如下:
-
访问协议与地址
所有 API 访问均通过 HTTPS 进行。- 主地址:
https://api.hamibot.com/ - 备用地址:
https://api.hamibot.cn/(已备案,适用于小程序等场景)
- 主地址:
-
身份验证
接口采用个人访问令牌(Personal Access Token)进行验证。你需要前往控制台生成新令牌,并在 HTTP 请求标头中发送。
示例 header:
Authorization: hmp_... -
速率限制与配额
API 请求受速率限制保护,以防止滥用。请求返回的 HTTP 标头会显示当前速率限制状态,具体配额信息可前往控制台查询。 -
响应状态
API 返回标准的 HTTP 状态码。例如在某些操作中,204 表示成功,422 表示参数错误。 -
集成示例
你可以使用 curl 或其他 HTTP 客户端调用接口。以下是一个身份验证请求的示例:
curl -H "Authorization: hmp_..." https://api.hamibot.com/
通过 REST API,你可以将 Hamibot 的自动化能力嵌入到自己的业务系统、CI/CD 流程或第三方应用中,实现更高效的自动化运维和管理。
补充回答 1
对于没有 id、text 和 desc 属性的控件,可以通过其他属性进行定位,或者获取其坐标后进行点击。Hamibot 支持多种控件属性选择器,包括 className、packageName、bounds、drawingOrder 等。
解决方法:
-
使用布局分析查看属性
打开悬浮窗和无障碍服务,点击蓝色的悬浮窗图标,然后点击绿色的布局分析图标,选择布局范围分析。点击目标控件,查看其详细属性。除了 id、text、desc 外,重点关注以下属性:className:控件类名,例如android.widget.ImageView。packageName:控件所在应用的包名。bounds:控件在屏幕上的范围。drawingOrder:控件在父控件中的绘制次序(安卓 7.0 及以上有效)。
-
组合属性定位控件
单一属性可能无法唯一确定控件,建议组合多个属性构建选择器。例如,同时指定className和packageName,或者结合bounds范围。 -
获取坐标点击
如果控件无法直接通过click()方法点击,或者定位后需要精确点击,可以使用bounds()获取控件屏幕范围,然后计算中心坐标进行点击。
代码示例:
// 文档地址 https://docs.hamibot.com/
// 通过 className 和 packageName 组合定位控件
var target = className('android.widget.ImageView').packageName('com.example.app').findOne();
if (target != null) {
// 获取控件在屏幕上的范围
var b = target.bounds();
// 点击控件中心坐标
click(b.centerX(), b.centerY());
} else {
toast('未找到目标控件');
}
注意事项:
- 选择器的条件通常需要可唯一确定控件,避免匹配到多个对象。
- 如果控件位于列表中,可能需要遍历父控件的子控件进行查找。
- 使用
bounds()获取坐标后,配合全局click(x, y)函数可以实现模拟物理点击,适用于某些无障碍服务无法直接响应的控件。
补充回答 2
遍历点击父控件下的子控件主要有两种方式:使用 children().forEach() 方法或使用 for 循环配合 childCount() 和 child(i)。这两种方法都可以有效获取父控件下的直接子控件集合并进行操作。
方法一:使用 children().forEach() 遍历
这种方式代码更简洁,适合直接对集合中的每个元素进行操作。
// 文档地址 https://docs.hamibot.com/
// 1. 找到父控件
var parent = className('android.widget.LinearLayout').findOne();
if (parent != null) {
// 2. 获取子控件集合并遍历
parent.children().forEach(function (child) {
// 3. 判断控件是否存在且可点击
if (child != null && child.clickable()) {
child.click();
sleep(1000); // 点击后等待,避免操作过快
}
});
} else {
toast('未找到父控件');
}
方法二:使用 for 循环配合索引遍历
这种方式更灵活,可以在遍历过程中使用索引变量,适合需要根据索引进行特定逻辑处理的场景。
// 文档地址 https://docs.hamibot.com/
// 1. 找到父控件
var parent = className('android.widget.LinearLayout').findOne();
if (parent != null) {
// 2. 获取子控件数量
var count = parent.childCount();
// 3. 通过索引遍历
for (var i = 0; i < count; i++) {
var child = parent.child(i);
// 4. 判断控件是否存在且可点击
if (child != null && child.clickable()) {
child.click();
sleep(1000);
}
}
} else {
toast('未找到父控件');
}
关键注意事项:
- 空值检查:由于布局捕捉的问题,
child(i)或遍历得到的child可能为null。务必在操作前判断child != null,否则脚本会报错停止。 - 可点击性判断:建议先判断
child.clickable()是否为true,避免对不可点击的控件执行点击操作导致无效或报错。 - JavaScript 兼容性:Hamibot 使用的 JavaScript 引擎是 Rhino 1.7.15,编写脚本时请使用
function关键字定义函数,不要使用箭头函数(=>),变量定义建议使用var。 - 父控件定位:确保父控件的选择器(如
className,id等)能准确唯一地定位到目标区域,否则可能遍历错误的控件集合。 - 操作间隔:遍历点击时建议加入
sleep()延时,给界面响应留出时间,防止因操作过快导致脚本异常或应用无响应。