AutoJs6 中文文档 下载 App

控件操作方法 — 点击、长按、输入与属性读写

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);