怎么获取屏幕所有控件 文本 坐标
我下面这个方式对吗
var allTexts = [];
try {
var list = document.find(uiSelector.visible()); // 只拿可见
for (var i = 0; i < list.length; i++) {
try {
var node = list[i];
var t = node.text() || "";
t = t.trim();
if (t.length() > 1) {
// 安全获取坐标(不报错)
var cx = node.getX() + node.getWidth() / 2;
var cy = node.getY() + node.getHeight() / 2;
if (cx > 0 && cy > 0) {
allTexts.push({
text: t,
x: cx,
y: cy
});
}
}
} catch (e) {}
}
} catch (e) {}

jrmtpk2515 · 6 小时前

回答

Hamibot AI
1
· 6 小时前

你的代码使用了错误的 API,documentuiSelector 在 Hamibot 中不存在。

正确的获取方式

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

// 获取屏幕所有可见控件
var allTexts = [];

// 方法1:遍历所有 TextView(最常用)
var textViews = className("android.widget.TextView").visible().find();
for (var i = 0; i < textViews.size(); i++) {
    var node = textViews.get(i);
    var t = node.text();
    if (t && t.trim().length > 0) {
        var bounds = node.bounds();
        if (bounds) {
            allTexts.push({
                text: t.trim(),
                x: bounds.centerX(),
                y: bounds.centerY()
            });
        }
    }
}

// 方法2:遍历所有可点击控件
var clickables = className("android.widget.Button").visible().find();
for (var i = 0; i < clickables.size(); i++) {
    var node = clickables.get(i);
    var t = node.text();
    if (t && t.trim().length > 0) {
        var bounds = node.bounds();
        if (bounds) {
            allTexts.push({
                text: t.trim(),
                x: bounds.centerX(),
                y: bounds.centerY()
            });
        }
    }
}

// 打印结果
log("共找到 " + allTexts.length + " 个控件");
for (var i = 0; i < Math.min(20, allTexts.length); i++) {
    var item = allTexts[i];
    log(i + ": [" + item.x + "," + item.y + "] " + item.text);
}

完整封装函数

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

function getAllControls() {
    var results = [];
    
    // 获取所有可见的 TextView
    var textViews = className("android.widget.TextView").visible().find();
    for (var i = 0; i < textViews.size(); i++) {
        var node = textViews.get(i);
        var text = node.text();
        var desc = node.desc();
        
        // 取 text 或 desc 中非空的
        var content = text || desc || "";
        content = content.trim();
        
        if (content.length > 0) {
            var bounds = node.bounds();
            if (bounds) {
                results.push({
                    text: content,
                    x: bounds.centerX(),
                    y: bounds.centerY(),
                    type: "TextView"
                });
            }
        }
    }
    
    // 获取所有 Button
    var buttons = className("android.widget.Button").visible().find();
    for (var i = 0; i < buttons.size(); i++) {
        var node = buttons.get(i);
        var text = node.text();
        if (text && text.trim().length > 0) {
            var bounds = node.bounds();
            if (bounds) {
                results.push({
                    text: text.trim(),
                    x: bounds.centerX(),
                    y: bounds.centerY(),
                    type: "Button"
                });
            }
        }
    }
    
    return results;
}

// 使用
var controls = getAllControls();
log("共获取 " + controls.length + " 个控件");
controls.forEach(function(c, i) {
    log(i + ": " + c.text + " @ (" + c.x + ", " + c.y + ")");
});

关键区别

你的写法 正确写法
document.find() className("xxx").find()
uiSelector.visible() .visible()
node.getX() node.bounds().centerX()

推荐:使用 Hamibot 客户端的布局分析功能(蓝色悬浮窗 → 布局范围分析),可以直观看到所有控件信息。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实