AutoJs6
AutoJs6 copied to clipboard
UiObject#compass - 控件罗盘
控件罗盘用于在控件布局中 "自由移动" (AutoJs6 v6.2.0+)
compass(c: CharSequence?): UiObject?
访问父控件
'p..(n) | p(n) | p..(m)...p(n)...'
'p' <-> 'p1'
// 传统方式
w.parent();
// 控件罗盘
w.compass('p');
w.compass('p1');
// 传统方式
w.parent().parent().parent();
// 控件罗盘
w.compass('p3');
w.compass('ppp');
w.compass('p1p2');
w.compass('p2p');
访问子控件
'c(n)... | c(n)>(n)...'
// 传统方式
w.child(0);
// 控件罗盘
w.compass('c0');
// 传统方式
w.child(1).child(0).child(2).child(0).child(1);
// 控件罗盘
w.compass('c1c0c2c0c1');
w.compass('c1>0>2>0>1');
访问兄弟控件
's([+-<>](n))'
// w 的第 2 个兄弟控件 (索引为 2)
w.parent().child(2);
// 控件罗盘
w.compass('s2');
// w 的相邻右侧控件 (相对索引 +1)
w.parent().child(w.indexInParent() + 1);
// 控件罗盘
w.compass('s>1');
// w 的左侧第 2 个控件 (相对索引 -2)
w.parent().child(w.indexInParent() - 2);
// 控件罗盘
w.compass('s<2');
// w 的倒数第 3 个兄弟控件 (索引为子控件总数 -3)
w.parent().child(w.childCount() - 3);
// 控件罗盘
w.compass('s-3');
访问可点击控件 (clickable)
'k(n)'
'k' <-> 'k1'
// 控件本身或许可点击
if (w.clickable()) w.click();
// 控件罗盘
let c = w.compass('k');
if (c.clickable()) c.click();
// 控件上一层或许可点击
if (w.clickable()) w.click();
else { let p = w.parent(); if (p.clickable()) p.click(); }
// 控件罗盘
let c = w.compass('k'); if (c.clickable()) c.click();
// 控件上两层或许可点击
if (w.clickable()) w.click();
else {
let p = w.parent();
if (p.clickable()) p.click();
else {
let p2 = p.parent();
if (p2.clickable()) p2.click();
}
}
// 控件罗盘
let c = w.compass('k2'); if (c.clickable()) c.click();
// Pickup 选择器
pickup(w, 'k2', 'click');
综合使用
虚拟场景: 按钮文本为 "立即查看", 按钮包含在一个可点击控件下 (即按钮本身不可点击, clickable 为 false, 但父控件 parent() 可点击). 父控件的索引是 3, 它的兄弟节点 0, 1, 2 分别是一个 ImageView, 包含纯数字本文的普通 View, 包含一段描述的 普通 View.
父控件兄弟: [0: 图像, 1: "9", 2: "这是一段描述", 3: 可点击控件] 父控件: [0: 按钮 ("立即查看")]
现需要获取到文本为纯数字的控件 (此处为 "9") 拿到数据 "9" 后, 点击 "立即查看" 按钮
// 传统方式
let w = text('点击进入').findOnce();
if (w !== null) {
let p = w.parent();
let cc = p.children();
let num = '?';
for (let i in cc) {
let c = cc[i];
if (c.desc() !== null && c.desc().match(/^\d+$/)) {
num = c.desc();
break;
} else if (c.text().match(/^\d+$/)) {
num = c.text();
break;
}
}
if (c.clickable()) {
c.click();
} else if (p.clickable()){
p.click();
}
console.log('num: ' + num);
}
// 控件罗盘 及 UiObject#content 控件属性
let w = text('点击进入').findOnce();
if (w !== null) {
let cc = c.compass('p').children();
let num = '?';
for (let i in cc) {
if (cc[i].content().match(/^\d+$/)) {
num = cc[i].content();
break;
}
let c = w.compass('k2');
if (c.clickable()) {
c.click();
}
console.log('num: ' + num);
}
// Pickup 选择器
pickup('点击进入', 'k2', 'click');
console.log('num: ' + pickup('点击进入', 'p2').pickup(/^\d+$/, 'content'));
参阅: Pickup 选择器
非常期待,希望尽快发布~~~