节点操作 UiObject
UiObject 是已经找到的那个节点。选择器用 UiSelector 定位,拿到对象后再点、输入、滑、读属性。
有节点时优先点节点。节点点不到、或界面没有可用节点时,再用坐标,见 手势 Gesture。
click() 返回 true 只表示无障碍已经把点击派发出去,不保证界面一定响应。返回 false 则一定没点上。
let sendButton = UiSelector().text('发送').findOne();
if (sendButton) {
sendButton.click();
}操作
| 方法 | 作用 |
|---|---|
click() | 点击 |
longClick() | 长按 |
scrollForward() | 向前滑(内容上移或左移) |
scrollBackward() | 向后滑(内容下移或右移) |
setSelection(start, end) | 选中输入框中的一段文字 |
copy() | 复制选中文本 |
cut() | 剪切选中文本 |
paste() | 粘贴到输入框 |
focus() | 获取焦点 |
setText(text) | 写入输入框全文 |
读取
| 方法 | 作用 |
|---|---|
bounds() | 屏幕矩形 |
highlight(seconds?, strokeDp?, color?) | 框选闪烁:参数均可省略;默认 2 秒 / 1dp / 蓝;新一次清掉上一次 |
clearHighlight() | 立刻清掉当前高亮 |
id() / text() / desc() / className() | 节点属性 |
getPackageName() | 所属包名 |
getChildCount() / children() / getChildren(index) / parent() | 父子关系 |
find(uiSelector) / findOne(uiSelector) | 在子树里再查 |
getDrawingOrder() / getHintText() | 绘制顺序、提示文案 |
isSelected() 等 | 状态判断 |
click()
返回: {boolean} 是否已发出点击
let sendButton = UiSelector().text('发送').findOne();
if (sendButton) {
sendButton.click();
}longClick()
返回: {boolean} 是否已发出长按
let sendButton = UiSelector().text('发送').findOne();
if (sendButton) {
sendButton.longClick();
}scrollForward()
返回: {boolean} 是否滑动成功
让下方内容往上、或右侧内容往左。返回 false 通常表示已经滑到底。
scrollBackward()
返回: {boolean} 是否滑动成功
让上方内容往下、或左侧内容往右。返回 false 通常表示已经滑到顶。
setSelection(startPosition, endPosition)
参数:
startPosition {number}起始下标endPosition {number}结束下标
返回: {boolean} 是否选中成功
只对输入框有效。选中后再 copy() / cut()。
copy()
返回: {boolean} 是否复制成功
复制当前选中的文本。先 setSelection。
let et = UiSelector().className('EditText').findOne();
et.setSelection(0, 2);
if (et.copy()) {
System.toast('复制成功');
} else {
System.toast('复制失败');
}cut()
返回: {boolean} 是否剪切成功
只能用于输入框,且当前有选中文本。
paste()
返回: {boolean} 是否粘贴成功
把剪贴板内容写入输入框。可先用 System.setClip。
System.setClip('DeekeScript');
let obj = UiSelector().className('EditText').findOne();
obj.paste();focus()
返回: {boolean} 是否获焦成功
let obj = UiSelector().className('EditText').findOne();
obj.focus();setText(text)
参数:
text {string}要写入的全文
返回: {boolean} 是否写入成功
覆盖输入框现有内容。
let obj = UiSelector().className('EditText').findOne();
obj.setText('DeekeScript');find(uiSelector)
参数:
uiSelector {UiSelector}在子树里用的条件
返回: {UiObject[]|null} 匹配到的子节点
只在当前节点的子孙里查,不是全屏。
let obj = UiSelector().className('LinearLayout').findOne();
let children = obj.find(UiSelector().className('TextView'));
for (let i = 0; i < children.length; i++) {
console.log(children[i].text());
}findOne(uiSelector)
参数:
uiSelector {UiSelector}子树条件
返回: {UiObject|null} 第一个匹配的子孙;没有则为 null
let obj = UiSelector().className('TextView').findOne();
let child = obj.findOne(UiSelector().className('TextView'));
if (child) {
console.log(child.text());
}bounds()
返回: {Rect} 含 left / top / right / bottom
节点在屏幕上的位置,可配合 Gesture 点中心。
let obj = UiSelector().text('发送').findOne();
if (obj) {
let bounds = obj.bounds();
console.log(bounds.left, bounds.top, bounds.right, bounds.bottom);
}highlight(seconds?, strokeDp?, color?)
在屏幕上框选本节点区域并闪烁,方便确认找没找对。会阻塞到闪烁结束。后续参数均可省略。
参数:
seconds {number}可选,闪烁秒数,默认2strokeDp {number}可选,线宽(dp),默认1color {string|number}可选,边框颜色,默认蓝色#FF3B82F6。支持#RGB/#RRGGBB/#AARRGGBB、rgba(r,g,b,a)、或数字 ARGB
返回: {boolean} 是否成功展示高亮层
优先使用无障碍 Overlay(一般只要开了无障碍即可);否则需要悬浮窗权限。
每次新的 highlight 会自动清掉上一次框:
let btn = UiSelector().text('发送').findOne();
if (btn) {
btn.highlight(); // 默认 2 秒 / 1dp / 蓝
btn.highlight(0.8); // 短闪
btn.highlight(2, 2); // 2 秒,线宽 2dp
btn.highlight(2, 1, '#FF0000'); // 红色边框
btn.highlight(2, 1, 'rgba(255,0,0,1)');
btn.click();
}
btn.clearHighlight(); // 立刻清掉id()
返回: {string} 节点 id
let obj = UiSelector().className('TextView').findOne();
if (obj) {
console.log(obj.id());
}text()
返回: {string} 节点文本
let obj = UiSelector().className('TextView').findOne();
if (obj) {
console.log(obj.text());
}desc()
返回: {string} 节点描述
let obj = UiSelector().className('ImageView').findOne();
if (obj) {
console.log(obj.desc());
}className()
返回: {string} 类名
let obj = UiSelector().className('TextView').findOne();
if (obj) {
console.log(obj.className());
}getPackageName()
返回: {string} 节点所属应用的包名
let obj = UiSelector().className('TextView').findOne();
if (obj) {
console.log(obj.getPackageName());
}getChildCount()
返回: {number} 直接子节点个数
let obj = UiSelector().className('LinearLayout').findOne();
if (obj) {
console.log(obj.getChildCount());
}children()
返回: 子节点集合,可继续 find / getChildren
let obj = UiSelector().className('LinearLayout').findOne();
if (obj && obj.getChildCount() > 0) {
let childs = obj.children().find(UiSelector().className('TextView'));
let child = obj.children().find(UiSelector().className('TextView'));
let indexChild = obj.children().getChildren(0);
}getChildren(index)
参数:
index {number}子节点下标,从 0 起
返回: {UiObject} 指定位置的子节点
let obj = UiSelector().className('LinearLayout').findOne();
let indexChild = obj.children().getChildren(0);parent()
返回: {UiObject} 父节点
let obj = UiSelector().className('TextView').findOne();
if (obj) {
let parent = obj.parent();
console.log(parent.className());
}getDrawingOrder()
返回: {number} 绘制顺序
let obj = UiSelector().className('TextView').findOne();
if (obj) {
console.log(obj.getDrawingOrder());
}getHintText()
返回: {string} 输入框提示文案
isSelected()
返回: {boolean} 是否处于选中态
let obj = UiSelector().className('RadioButton').findOne();
if (obj) {
console.log(obj.isSelected());
}isClickable()
返回: {boolean} 节点是否声明可点击
let obj = UiSelector().className('Button').findOne();
if (obj) {
console.log(obj.isClickable());
}isLongClickable()
返回: {boolean} 是否可长按
let obj = UiSelector().className('Button').findOne();
if (obj) {
console.log(obj.isLongClickable());
}isEditable()
返回: {boolean} 是否可编辑
let obj = UiSelector().className('EditText').findOne();
if (obj) {
console.log(obj.isEditable());
}isFocusable()
返回: {boolean} 是否可以获焦
let obj = UiSelector().className('EditText').findOne();
if (obj) {
console.log(obj.isFocusable());
}isFocused()
返回: {boolean} 是否已经获焦
let obj = UiSelector().className('EditText').findOne();
if (obj) {
console.log(obj.isFocused());
}isCheckable()
返回: {boolean} 是否可勾选
let obj = UiSelector().className('CheckBox').findOne();
if (obj) {
console.log(obj.isCheckable());
}isEnabled()
返回: {boolean} 是否处于可用状态
let obj = UiSelector().className('Button').findOne();
if (obj) {
console.log(obj.isEnabled());
}isPassword()
返回: {boolean} 是否为密码输入框
isScrollable()
返回: {boolean} 是否可滚动
let obj = UiSelector().className('ScrollView').findOne();
if (obj) {
console.log(obj.isScrollable());
}isVisibleToUser()
返回: {boolean} 是否对用户可见
let obj = UiSelector().className('TextView').findOne();
if (obj) {
console.log(obj.isVisibleToUser());
}isChecked()
返回: {boolean} 是否已勾选
let obj = UiSelector().className('CheckBox').findOne();
if (obj) {
console.log(obj.isChecked());
}