Skip to content

节点操作 UiObject ​

UiObject 是已经找到的那个节点。选择器用 UiSelector 定位,拿到对象后再点、输入、滑、读属性。

有节点时优先点节点。节点点不到、或界面没有可用节点时,再用坐标,见 手势 Gesture。

click() 返回 true 只表示无障碍已经把点击派发出去,不保证界面一定响应。返回 false 则一定没点上。

javascript
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} 是否已发出点击

javascript
let sendButton = UiSelector().text('发送').findOne();
if (sendButton) {
    sendButton.click();
}

longClick() ​

返回: {boolean} 是否已发出长按

javascript
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。

javascript
let et = UiSelector().className('EditText').findOne();
et.setSelection(0, 2);
if (et.copy()) {
    System.toast('复制成功');
} else {
    System.toast('复制失败');
}

cut() ​

返回: {boolean} 是否剪切成功

只能用于输入框,且当前有选中文本。

paste() ​

返回: {boolean} 是否粘贴成功

把剪贴板内容写入输入框。可先用 System.setClip。

javascript
System.setClip('DeekeScript');
let obj = UiSelector().className('EditText').findOne();
obj.paste();

focus() ​

返回: {boolean} 是否获焦成功

javascript
let obj = UiSelector().className('EditText').findOne();
obj.focus();

setText(text) ​

参数:

  • text {string} 要写入的全文

返回: {boolean} 是否写入成功

覆盖输入框现有内容。

javascript
let obj = UiSelector().className('EditText').findOne();
obj.setText('DeekeScript');

find(uiSelector) ​

参数:

  • uiSelector {UiSelector} 在子树里用的条件

返回: {UiObject[]|null} 匹配到的子节点

只在当前节点的子孙里查,不是全屏。

javascript
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

javascript
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 点中心。

javascript
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} 可选,闪烁秒数,默认 2
  • strokeDp {number} 可选,线宽(dp),默认 1
  • color {string|number} 可选,边框颜色,默认蓝色 #FF3B82F6。支持 #RGB / #RRGGBB / #AARRGGBB、rgba(r,g,b,a)、或数字 ARGB

返回: {boolean} 是否成功展示高亮层

优先使用无障碍 Overlay(一般只要开了无障碍即可);否则需要悬浮窗权限。

每次新的 highlight 会自动清掉上一次框:

javascript
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

javascript
let obj = UiSelector().className('TextView').findOne();
if (obj) {
    console.log(obj.id());
}

text() ​

返回: {string} 节点文本

javascript
let obj = UiSelector().className('TextView').findOne();
if (obj) {
    console.log(obj.text());
}

desc() ​

返回: {string} 节点描述

javascript
let obj = UiSelector().className('ImageView').findOne();
if (obj) {
    console.log(obj.desc());
}

className() ​

返回: {string} 类名

javascript
let obj = UiSelector().className('TextView').findOne();
if (obj) {
    console.log(obj.className());
}

getPackageName() ​

返回: {string} 节点所属应用的包名

javascript
let obj = UiSelector().className('TextView').findOne();
if (obj) {
    console.log(obj.getPackageName());
}

getChildCount() ​

返回: {number} 直接子节点个数

javascript
let obj = UiSelector().className('LinearLayout').findOne();
if (obj) {
    console.log(obj.getChildCount());
}

children() ​

返回: 子节点集合,可继续 find / getChildren

javascript
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} 指定位置的子节点

javascript
let obj = UiSelector().className('LinearLayout').findOne();
let indexChild = obj.children().getChildren(0);

parent() ​

返回: {UiObject} 父节点

javascript
let obj = UiSelector().className('TextView').findOne();
if (obj) {
    let parent = obj.parent();
    console.log(parent.className());
}

getDrawingOrder() ​

返回: {number} 绘制顺序

javascript
let obj = UiSelector().className('TextView').findOne();
if (obj) {
    console.log(obj.getDrawingOrder());
}

getHintText() ​

返回: {string} 输入框提示文案

isSelected() ​

返回: {boolean} 是否处于选中态

javascript
let obj = UiSelector().className('RadioButton').findOne();
if (obj) {
    console.log(obj.isSelected());
}

isClickable() ​

返回: {boolean} 节点是否声明可点击

javascript
let obj = UiSelector().className('Button').findOne();
if (obj) {
    console.log(obj.isClickable());
}

isLongClickable() ​

返回: {boolean} 是否可长按

javascript
let obj = UiSelector().className('Button').findOne();
if (obj) {
    console.log(obj.isLongClickable());
}

isEditable() ​

返回: {boolean} 是否可编辑

javascript
let obj = UiSelector().className('EditText').findOne();
if (obj) {
    console.log(obj.isEditable());
}

isFocusable() ​

返回: {boolean} 是否可以获焦

javascript
let obj = UiSelector().className('EditText').findOne();
if (obj) {
    console.log(obj.isFocusable());
}

isFocused() ​

返回: {boolean} 是否已经获焦

javascript
let obj = UiSelector().className('EditText').findOne();
if (obj) {
    console.log(obj.isFocused());
}

isCheckable() ​

返回: {boolean} 是否可勾选

javascript
let obj = UiSelector().className('CheckBox').findOne();
if (obj) {
    console.log(obj.isCheckable());
}

isEnabled() ​

返回: {boolean} 是否处于可用状态

javascript
let obj = UiSelector().className('Button').findOne();
if (obj) {
    console.log(obj.isEnabled());
}

isPassword() ​

返回: {boolean} 是否为密码输入框

isScrollable() ​

返回: {boolean} 是否可滚动

javascript
let obj = UiSelector().className('ScrollView').findOne();
if (obj) {
    console.log(obj.isScrollable());
}

isVisibleToUser() ​

返回: {boolean} 是否对用户可见

javascript
let obj = UiSelector().className('TextView').findOne();
if (obj) {
    console.log(obj.isVisibleToUser());
}

isChecked() ​

返回: {boolean} 是否已勾选

javascript
let obj = UiSelector().className('CheckBox').findOne();
if (obj) {
    console.log(obj.isChecked());
}

相关 ​