控件操作方法 — 点击、长按、输入与属性读写
UiObject 可执行操作总览
UiObject 是 AutoJs6 对单个控件的封装,以下是所有可执行的操作方法:
let btn = text("确定").findOne();
// 执行操作
btn.click(); // 点击
btn.longClick(); // 长按
// 获取属性
btn.text(); // 获取文字
btn.bounds(); // 获取坐标范围
btn.childCount(); // 子控件数量
// ... 等等
点击类操作
单击
let btn = id("confirm").findOne();
btn.click(); // 标准点击
btn.click(500); // 点击后等待 500ms
btn.click(true, 500); // 是否可点击时才点击 + 等待
长按
let item = id("list_item").findOne();
item.longClick(); // 标准长按
item.longClick(2000); // 长按 2 秒
精确点击位置
有时需要点击控件内的某个具体位置:
let control = className("Button").findOne();
let rect = control.bounds();
// 点击控件中心
click(rect.centerX(), rect.centerY());
// 点击控件左上偏移 20px 处
click(rect.left + 20, rect.top + 20);
全局坐标点击
// 不需要控件,直接点屏幕坐标
click(540, 1200);
// 长按坐标点
longClick(540, 1200);
// 双击
doubleClick(540, 1200);
输入类操作
设置文本(EditText)
let input = id("search_box").findOne();
// 方式一:直接设置(推荐,但部分应用不支持)
input.setText("搜索内容");
// 方式二:先清空再设置
input.clear();
input.setText("搜索内容");
// 方式三:模拟人工输入(最稳定)
input.click(); // 先聚焦
sleep(200);
input.input("搜索内容"); // 逐个字符输入
Append / Prepend
let input = id("comment").findOne();
// 在末尾追加
input.append("新的评论");
// 在开头插入
input.prepend("开头内容 - ");
滑动与滚动
控件内滚动
let scrollView = className("ScrollView").findOne();
// 向上滑(内容向下滚)
scrollView.scrollUp();
// 向下滑
scrollView.scrollDown();
// 向左 / 向右
scrollView.scrollLeft();
scrollView.scrollRight();
// 滚动到底部
scrollView.scrollToEnd();
// 滚动到顶部
scrollView.scrollToBeginning();
屏幕手势(不依赖控件)
// 滑动 — 从 (x1, y1) 滑到 (x2, y2),持续时间 ms
swipe(540, 1500, 540, 500, 500);
// 屏幕中间向上滑 1000px,用 500ms
// 快速滑动(fling)
fling(0, 1500, 0, 500, 500);
// 拖拽
drag(540, 1200, 540, 600, 800);
手势模拟
// 自定义手势(多点触控)
let gesture = gesture(
5000, // 手势总时长
[540, 1500], // 起点
[540, 1400], // 轨迹点 1
[540, 1300], // 轨迹点 2
// ...
[540, 500] // 终点
);
// 同时执行两个手势(双指)
multiGesture([
gesture1,
gesture2
]);
属性读写
读取属性
let control = id("target").findOne();
// 基本属性
console.log("文字: " + control.text());
console.log("id: " + control.id());
console.log("desc: " + control.desc());
console.log("className: " + control.className());
console.log("包名: " + control.packageName());
// 坐标
let rect = control.bounds();
console.log("位置: (" + rect.left + "," + rect.top + ")");
console.log("尺寸: " + rect.width() + "x" + rect.height());
console.log("中心点: (" + rect.centerX() + "," + rect.centerY() + ")");
// 状态
console.log("可点击: " + control.clickable());
console.log("已选中: " + control.selected());
console.log("已勾选: " + control.checked());
console.log("启用中: " + control.enabled());
console.log("可见: " + control.visibleToUser());
设置属性(有限支持)
let input = id("search").findOne();
input.setText("新内容"); // 设置文本(EditText)
input.clear(); // 清空
input.append("追加内容");
input.prepend("开头内容");
注意:AutoJs6 通过无障碍服务操作,很多属性只读不可写。setText 是最常用的可写操作,其他属性通常无法直接修改。
isShifted — 检测位置变化
v6.7 新增:
let control = id("dynamic_item").findOne();
// 检测控件位置是否变化了
if (control.isShifted()) {
console.log("控件移动了");
}
// 捕获当前状态快照
let snapshot = control.snapshot();
sleep(1000);
let current = control.snapshot();
// 对比 snapshot 和 current
控件遍历
获取子控件
let container = id("list_container").findOne();
let children = container.children();
children.forEach((child, i) => {
console.log(`${i}: ${child.text() || "(无文字)"}`);
});
获取父控件
let button = text("确定").findOne();
let parent = button.parent(); // 直接父控件
let grandParent = button.parent(2); // 向上两级
获取兄弟控件
let title = id("title").findOne();
let siblings = title.parent().children();
// siblings 中包含 title 自己,需要过滤
实战:完整点击流程
function clickByText(targetText, timeout = 3000) {
let btn = text(targetText).findOne(timeout);
if (!btn) {
toast("未找到: " + targetText);
return false;
}
// 等待控件可点击
if (!btn.clickable()) {
toast("控件不可点击");
return false;
}
btn.click();
toast("已点击: " + targetText);
return true;
}
// 使用
clickByText("登录", 5000);