AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

UiSelector#pickup - Pickup 选择器

Open SuperMonster003 opened this issue 3 years ago • 0 comments

Pickup 选择器用于在控件布局中快捷选择控件 (AutoJs6 v6.2.0+) 支持选择器混合, 支持控件罗盘, 支持结果筛选, 支持执行结果行为

pickup(): Any?
pickup(selector: Any?): Any?
pickup(selector: Any?, s: CharSequence?): Any?
pickup(selector: Any?, compass: CharSequence?, resultType: Any?): Any?
pickup(root: UiObject?, selector: Any?, compass: CharSequence?, resultType: Any?): Any?

选择器混合

type SelectorContent = string | RegExp;
type SelectorObject = Object.<string, any> | Object.<string, number[]>
type SelectorLegacy = UiSelector;
type SelectorMixed = SelectorContent | SelectorObject | SelectorLegacy;
type Selector = SelectorMixed | SelectorMixed[];
// 筛选一个有内容且长度大于 5 的控件
pickup(contentMatches(/.{5,}/));
pickup(/.{5,}/);
pickup({contentMatches: /.{5,}/});

// 筛选一个有内容且长度大于 5 的可点击的控件
pickup(contentMatches(/.{5,}/).clickable());
pickup([/.{5,}/, clickable()]);
pickup({
    contentMatches: /.{5,}/,
    clickable: true,
});

// 筛选一个有内容且长度大于 5 的可点击的且屏幕水平居中的控件
pickup(contentMatches(/.{5,}/).clickable().screenCenterX());
pickup([/.{5,}/, clickable().screenCenterX()]);
pickup({
    contentMatches: /.{5,}/,
    clickable: true,
    screenCenterX: true,
});

控件罗盘

// 筛选一个有内容且长度大于 5 控件的右侧相邻兄弟控件
pickup(/.{5,}/, "s>1");

// 筛选一个有内容且长度大于 5 控件的二级父控件的第三个子控件
pickup(/.{5,}/, "p2c3");

// 筛选一个有内容且长度大于 5 控件的二级临近可点击控件
pickup(/.{5,}/, "k2");

结果筛选

如不指定, 默认返回 UiObject

结果筛选采用字符串方式, 同一个筛选器往往有多个同义词: "#", "w", "widget" -> UiObject "{}", "wc", "collection", "list", in listAliases("#", "w") -> List<UiObject> "[]", "ws", "widgets", in arrayAliases("#", "w") -> Array<UiObject> "$", "txt", "content" -> String "contents", in arrayAliases("$", "txt", "content") -> Array<String> ".", "pt", "point" -> Point "points", "pts", in arrayAliases(".", "point", "pt") -> Array<Point> "@", "selector", "sel" -> UiSelector "?", "exists" -> Boolean

上述 arrayAliases(sym, a, b, c...) 表示 "$sym$sym", sym[], [sym], a[], [a], b[], [b], c[], [c]... 上述 listAliases(sym, a, b, c...) 表示 sym{}, {sym}, a{}, {a}, b{}, {b}, c{}, {c}... 例如筛选内容列表, 可用 contents, 以及 $$, [$], $[], txt[], [txt], content[], [content] 表示

除上述自定义筛选器外, 内置的控件行为也可作为筛选器使用 如 w.click() 可用 "click" 替代 pickup("text").click(); // 可能产生空指针 pickup("text", "click"); // 空指针安全

// 筛选文本或描述 (如 "开始")
// 传统方式
let wT = text('开始').findOnce();
if (wT !== null) {
    if (wT.text()) wT.text();
} else {
    wT = desc('开始').findOnce();
    if (wT !== null) wT.desc();
}
// content 系列选择器
let w = content('开始');
if (w !== null) w.content();
// Pickup 选择器
pickup('开始', 'content'); // 'content' 可更换为 '$' 或 'txt' (注意不是 'text')

// 筛选所有有内容的控件并返回内容列表
// 传统方式
let c = contentMatches(/.+/).find();
if (c !== null) c.toArray();
// Pickup 选择器
pickup(/.+/, '$$');

// 筛选所有有内容且可点击的控件并返回内容列表
// 传统方式
let c = contentMatches(/.+/).clickable().find();
if (c !== null) c.toArray();
// Pickup 选择器
pickup(contentMatches(/.+/).clickable(), 'contents');
/* 或 */ pickup([/.+/, clickable()], '$$');
/* 或 */ pickup({
    contentMatches: /.+/,
    clickable: true,
}, '$[]').filter(Boolean); // 额外增加了空内容过滤

// 筛选一个有内容的控件并返回第 0 个子控件
// 传统方式
let w = contentMatches(/.+/).findOnce();
if (w !== null) w.child(0);
// Pickup 选择器
pickup(/.+/, 'c0');
/* 或 */ pickup(/.+/, ['child', 0]);

以某个控件作为根节点
> 默认所有选择器都以窗口根节点为 root 进行查找
> Pickup 选择器同时支持将任意节点作为 root
// 筛选一个控件并在此控件下再次筛选
let root = pickup('开始');
pickup(root, /\d+/, '$'); // 只查找 root 所有子控件而非当前窗口全部控件

作为控件方法使用

UiObject.pickup(selector: Any?, compass: CharSequence?, resultType: Any?): Any?

Pickup 除了可以用于选择器, 还可用于控件方法 (形如 w.pickup()) 此时 w.pickup(...) 与 pickup(w, ...) 等价 但依然有空指针安全的区别

// 两种效果相同的筛选方法
let root = pickup('开始');
/* 1 */ pickup(root, /\d+/, '$');
/* 2 */ root.pickup(/\d+/, '$'); // root 可能为 null

参阅: 控件罗盘

SuperMonster003 avatar Jun 17 '22 04:06 SuperMonster003