怎么获取屏幕所有控件 文本 坐标
我下面这个方式对吗
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) {}
回答
你的代码使用了错误的 API,document 和 uiSelector 在 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 生成,可能不准确,请注意核实