panchengyong
10 days ago b2d3f7caf927e5b83ec52efb74f1f818dbb15236
rpa/libs/global.js
@@ -32,7 +32,7 @@
/**
 * 取得配置的JSON
 * @return {any} JSON数据
 * @return {null|JSON} JSON数据
 */
function getConfigJSON() {
    var d = configWrapper.getParams();
@@ -91,6 +91,7 @@
/**
 * 是否是agent模式
 * @return {boolean}
 */
function isAgentMode() {
    if (configWrapper == null) {
@@ -101,6 +102,7 @@
/**
 * 是否是无障碍模式
 * @return {boolean}
 */
function isAccMode() {
    if (configWrapper == null) {
@@ -151,7 +153,7 @@
/**
 * 获取节点信息
 * @param timeout 超时时间
 * @return {Array} 节点信息集合
 * @return {null|NodeInfo[]} 节点信息集合
 */
S.prototype.getNodeInfo = function (timeout) {
    return getNodeInfo(this, timeout);
@@ -160,7 +162,7 @@
/**
 * 通过选择器 获取第一个节点信息
 * @param timeout 等待时间,单位是毫秒
 * @return {NodeInfo} 对象或者null
 * @return {null|NodeInfo} 对象或者null
 */
S.prototype.getOneNodeInfo = function (timeout) {
    return getOneNodeInfo(this, timeout);
@@ -713,7 +715,7 @@
/**
 * 取得中间的坐标点
 * @return Point 对象
 * @return {Point} 对象
 */
Rect.prototype.center = function () {
    var p = new Point(null);
@@ -854,7 +856,7 @@
/**
 * 该节点的父级节点
 * @return NodeInfo 对象 或者null
 * @return {null|NodeInfo} 对象 或者null
 */
NodeInfo.prototype.parent = function () {
    return getNodeInfoParent(this);
@@ -864,7 +866,7 @@
/**
 * 取得单个子节点
 * @param index 子节点索引
 * @return NodeInfo 对象 或者null
 * @return {null|NodeInfo} 对象 或者null
 */
NodeInfo.prototype.child = function (index) {
    return getNodeInfoChild(this, index);
@@ -873,7 +875,7 @@
/**
 * 取得所有子节点
 * @return NodeInfo 节点集合
 * @return {null|NodeInfo[]} 节点集合
 */
NodeInfo.prototype.allChildren = function () {
    return getNodeInfoAllChildren(this);
@@ -882,7 +884,7 @@
/**
 * 当前节点的所有兄弟节点
 * @return NodeInfo 节点集合
 * @return {null|NodeInfo[]} 节点集合
 */
NodeInfo.prototype.siblings = function () {
    return getSiblingNodeInfo(this);
@@ -891,14 +893,14 @@
/**
 * 在当前节点前面的兄弟节点
 * @return NodeInfo 节点集合
 * @return {null|NodeInfo[]} 节点集合
 */
NodeInfo.prototype.previousSiblings = function () {
    return getPreviousSiblingNodeInfo(this);
};
/**
 * 点击中心点
 * @return 布尔型 true 成功
 * @return {boolean} true 成功
 */
NodeInfo.prototype.clickCenter = function () {
    return clickCenter(this.bounds);
@@ -908,7 +910,7 @@
 * 通过选择器 获取第一个节点信息
 * @param selectors 选择器
 * @param timeout
 * @return {@link NodeInfo} 对象或者null
 * @return {null|NodeInfo} 对象或者null
 */
NodeInfo.prototype.getOneNodeInfo = function (selectors, timeout) {
    if (isAccMode()) {
@@ -925,7 +927,7 @@
 * 通过选择器 获取节点信息
 * @param selectors 选择器
 * @param timeout
 * @return {Array} NodeInfo 数组
 * @return {null|NodeInfo[]} NodeInfo 数组
 */
NodeInfo.prototype.getNodeInfo = function (selectors, timeout) {
    if (isAccMode()) {
@@ -938,7 +940,7 @@
/**
 * 在当前节点后面的兄弟节点
 * @return NodeInfo 节点集合
 * @return {null|NodeInfo[]} 节点集合
 */
NodeInfo.prototype.nextSiblings = function () {
    return getNextSiblingNodeInfo(this);
@@ -953,14 +955,23 @@
};
/**
 * 无指针点击节点
 * @return boolean|布尔型 true 成功 ,false 失败
 * @return {boolean} true 成功 ,false 失败
 */
NodeInfo.prototype.clickEx = function () {
    return clickExNodeInfo(this);
};
/**
 * 聚焦
 * @return {boolean}
 */
NodeInfo.prototype.setFocus = function () {
    return setFocusNodeInfo(this);
};
/**
 * 无指针长点击节点
 * @return boolean|布尔型 true 成功 ,false 失败
 * @return {boolean} true 成功 ,false 失败
 */
NodeInfo.prototype.longClickEx = function () {
    return longClickExNodeInfo(this);
@@ -968,42 +979,42 @@
/**
 * 向前滚动
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
NodeInfo.prototype.scrollForward = function () {
    return scrollForwardNodeInfo(this);
};
/**
 * 向后滚动
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
NodeInfo.prototype.scrollBackward = function () {
    return scrollBackwardNodeInfo(this);
};
/**
 * 向下滚动
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
NodeInfo.prototype.scrollDown = function () {
    return scrollDownNodeInfo(this);
};
/**
 * 向上滚动
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
NodeInfo.prototype.scrollUp = function () {
    return scrollUpNodeInfo(this);
};
/**
 * 向左滚动
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
NodeInfo.prototype.scrollLeft = function () {
    return scrollLeftNodeInfo(this);
};
/**
 * 向右滚动
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
NodeInfo.prototype.scrollRight = function () {
    return scrollRightNodeInfo(this);
@@ -1012,7 +1023,7 @@
/**
 * 对某个节点粘贴数据
 * @param content 要输入的内容
 * @return boolean|布尔型 true 成功 ,false 失败
 * @return {boolean} true 成功 ,false 失败
 */
NodeInfo.prototype.pasteText = function (content) {
    return pasteTextNodeInfo(this, content);
@@ -1021,7 +1032,7 @@
/**
 * 长点击节点
 * @return boolean|布尔型 true 成功 ,false 失败
 * @return {boolean} true 成功 ,false 失败
 */
NodeInfo.prototype.longClick = function () {
    return longClickRandomRect(this.bounds);
@@ -1029,7 +1040,7 @@
/**
 * 对某个节点输入数据
 * @param content 要输入的内容
 * @return boolean|布尔型 true 成功 ,false 失败
 * @return {boolean} true 成功 ,false 失败
 */
NodeInfo.prototype.inputText = function (content) {
    return inputTextNodeInfo(this, content);
@@ -1037,7 +1048,7 @@
/**
 * 使用输入法对某个节点输入数据,前提是已经设置本程序的输入法为默认输入法
 * @param content 要输入的内容
 * @return boolean|布尔型 true 成功 ,false 失败
 * @return {boolean} true 成功 ,false 失败
 */
NodeInfo.prototype.imeInputText = function (content) {
    return imeInputTextNodeInfo(this, content);
@@ -1045,7 +1056,7 @@
/**
 * 使用输入法对某个节点输入数据,前提是已经设置本程序的输入法为默认输入法
 * @param content 具体请看 KeyEvent.KEYCODE_*的值,例如66 = enter 67=del,84=SEARCH
 * @return boolean|布尔型 true 成功 ,false 失败
 * @return {boolean} true 成功 ,false 失败
 */
NodeInfo.prototype.imeInputKeyCode = function (content) {
    return imeInputKeyCodeNodeInfo(this, content);
@@ -1053,7 +1064,7 @@
/**
 * 清除节点文本数据
 *  @return boolean 布尔型| true代表成功
 *  @return {boolean} 布尔型| true代表成功
 */
NodeInfo.prototype.clearText = function () {
    return clearTextFieldNodeInfo(this);
@@ -1079,14 +1090,22 @@
function AutoImage(uuid) {
    this.uuid = uuid;
    this.uuid = uuid + "";
    this.mat = false;
    if (uuid != null && uuid != undefined) {
        this.mat = uuid.indexOf("-mat") != -1;
    }
}
AutoImage.prototype.toString = function () {
    return JSON.stringify({"uuid": this.uuid, "mat": this.mat, "aiobj": true});
};
/**
 * 点击文本
 * @param text 文本
 * @return boolean|布尔型
 * @return {boolean}
 */
function clickText(text) {
    if (isAccMode()) {
@@ -1100,7 +1119,7 @@
/**
 * 随机点击选择器的任意元素
 * @param selectors 选择器对象
 * @return boolean|布尔型
 * @return {boolean}
 */
function clickRandom(selectors) {
    if (isAccMode()) {
@@ -1114,7 +1133,7 @@
/**
 * 随机点击选择器的任意元素(无指针模式)
 * @param selectors 选择器对象
 * @return boolean|布尔型
 * @return {boolean}
 */
function clickRandomEx(selectors) {
    if (isAccMode()) {
@@ -1129,7 +1148,7 @@
/**
 * 随机点击区域中的坐标
 * @param rect 区域对象
 * @return boolean|布尔型
 * @return {boolean}
 */
function clickRandomRect(rect) {
    if (isAccMode()) {
@@ -1144,7 +1163,7 @@
/**
 * 随机长点击区域中的坐标
 * @param rect 区域对象
 * @return boolean|布尔型
 * @return {boolean}
 */
function longClickRandomRect(rect) {
    if (isAccMode()) {
@@ -1159,7 +1178,7 @@
/**
 * 点击选择器
 * @param selectors 选择器对象
 * @return boolean|布尔型
 * @return {boolean}
 */
function click(selectors) {
    if (isAccMode()) {
@@ -1174,7 +1193,7 @@
/**
 * 无指针模式点击选择器
 * @param selectors 选择器对象
 * @return boolean|布尔型
 * @return {boolean}
 */
function clickEx(selectors) {
    if (isAccMode()) {
@@ -1186,9 +1205,23 @@
}
/**
 * 设置节点聚焦
 * @param selectors 选择器对象
 * @return {boolean}
 */
function setFocus(selectors) {
    if (isAccMode()) {
        return acEvent.setFocus(selectors);
    } else if (isAgentMode()) {
        return agentEvent.setFocus(selectors);
    }
    return false;
}
/**
 * 无指针模式长按选择器
 * @param selectors 选择器对象
 * @return boolean|布尔型
 * @return {boolean}
 */
function longClickEx(selectors) {
    if (isAccMode()) {
@@ -1202,7 +1235,7 @@
/**
 * 点击某个区域中心坐标点
 * @param rect 区域
 * @return  布尔型 true 成功,false 失败
 * @return {boolean} 布尔型 true 成功,false 失败
 */
function clickCenter(rect) {
    if (isAccMode()) {
@@ -1218,7 +1251,7 @@
 * 点击坐标
 * @param x x坐标
 * @param y y坐标
 * @return boolean|布尔型
 * @return {boolean}
 */
function clickPoint(x, y) {
    if (isAccMode()) {
@@ -1233,7 +1266,7 @@
 * 双击坐标
 * @param x x坐标
 * @param y y坐标
 * @return boolean|布尔型
 * @return {boolean}
 */
function doubleClickPoint(x, y) {
    if (isAccMode()) {
@@ -1247,7 +1280,7 @@
/**
 * 长点击选择器
 * @param selectors 选择器对象
 * @return boolean|布尔型
 * @return {boolean}
 */
function longClick(selectors) {
    if (isAccMode()) {
@@ -1262,7 +1295,7 @@
 * 长点击坐标
 * @param x x坐标
 * @param y y坐标
 * @return boolean|布尔型
 * @return {boolean}
 */
function longClickPoint(x, y) {
    if (isAccMode()) {
@@ -1277,7 +1310,7 @@
/**
 * 获取选择器得到的文本数据
 * @param selectors 选择器
 * @return 字符串集合
 * @return {null|string} 字符串集合
 */
function getText(selectors) {
    if (isAccMode()) {
@@ -1292,7 +1325,7 @@
 * 获取节点属性信息
 * @param selectors 选择器
 * @param attr 属性值,例如 text,className,更多的属性请参考NodeInfo对象属性
 * @return null|字符串数组|Rect对象数组
 * @return {null|any[]} null|字符串数组|Rect对象数组
 */
function getNodeAttrs(selectors, attr) {
    if (selectors == null || attr == null) {
@@ -1339,7 +1372,7 @@
/**
 * 设置各种手势模式事件的操作类型,默认是异步,目前只对无障碍模式有效
 * @param mode 1 代表异步,2代表同步
 * @param bool true代表成功 false代表失败
 * @return {boolean} true代表成功 false代表失败
 */
function setGestureActionMode(mode) {
    if (isAccMode()) {
@@ -1353,7 +1386,7 @@
 * 获取节点信息
 * @param selectors 选择器
 * @param timeout 超时时间,单位是毫秒
 * @return {Array} NodeInfo 数组 节点信息集合
 * @return {null|NodeInfo[]} NodeInfo 数组 节点信息集合
 */
function getNodeInfo(selectors, timeout) {
    if (isAccMode()) {
@@ -1367,7 +1400,7 @@
/**
 * 通过Selector 判断元素是否存在
 * @param selectors 选择器
 * @return bool|布尔型
 * @return {boolean}
 */
function has(selectors) {
    if (isAccMode()) {
@@ -1382,7 +1415,7 @@
 * 通过Selector 判断并等待元素是否存
 * @param selectors 选择器
 * @param timeout 超时时间,单位毫秒
 * @return bool|布尔型
 * @return {boolean}
 */
function waitExistNode(selectors, timeout) {
    if (timeout <= 0) {
@@ -1410,7 +1443,7 @@
 *  等待activity界面出现
 * @param activity 界面名称
 * @param timeout 超时时间,单位毫秒
 * @return bool|布尔型
 * @return {boolean}
 */
function waitExistActivity(activity, timeout) {
    if (activity == null) {
@@ -1429,7 +1462,7 @@
/**
 * 将元素节点变成XML
 * @return string string|null
 * @return {null|string} string|null
 */
function dumpXml() {
    if (isAccMode()) {
@@ -1444,7 +1477,7 @@
/**
 *  将通知发射处理,相当于点击了通知栏
 * @param seqId
 * @return bool|布尔型
 * @return {boolean}
 */
function shotNotification(seqId) {
    if (isAccMode()) {
@@ -1458,7 +1491,7 @@
/**
 * 将通知进行取消操作
 * @param seqId
 * @return bool|布尔型
 * @return {boolean}
 */
function cancelNotification(seqId) {
    if (isAccMode()) {
@@ -1469,6 +1502,11 @@
    return false;
}
/**
 *
 * @param seqId
 * @return {boolean}
 */
function ignoreNotification(seqId) {
    if (isAccMode()) {
        return acEvent.ignoreNotification(seqId);
@@ -1482,7 +1520,7 @@
 * 获取toast数据
 *  @param pkg 指定包名
 * @param size 指定获取的条数
 * @return null|ToastInfo数组
 * @return {null|ToastInfo[]} null|ToastInfo数组
 */
function getLastToast(pkg, size) {
    if (isAccMode()) {
@@ -1497,7 +1535,7 @@
 * 获取最近通知栏对象
 * @param pkg 指定包名
 * @param size 指定获取的条数
 * @return NotificationInfo数组|null
 * @return {null|NotificationInfo[]} 数组|null
 */
function getLastNotification(pkg, size) {
    if (isAccMode()) {
@@ -1514,7 +1552,7 @@
 * 运行环境: 无限制
 * <Br/>
 * @param timeout 请求权限超时时间 单位是秒
 * @return true 代表请求权限成功,false代表失败
 * @return {boolean} true 代表请求权限成功,false代表失败
 */
function requestNotificationPermission(timeout) {
    if (isAccMode()) {
@@ -1531,7 +1569,7 @@
 * 运行环境: 无限制
 * <Br/>
 * 兼容版本: Android 5.0 以上
 * @return true 有权限,false 代表无权限
 * @return  {boolean} true 有权限,false 代表无权限
 */
function hasNotificationPermission() {
    if (isAccMode()) {
@@ -1545,7 +1583,7 @@
/**
 * 取得当前运行的Activity类名
 * @return {string}
 * @return {null|string}
 */
function getRunningActivity() {
    if (isAccMode()) {
@@ -1559,7 +1597,7 @@
/**
 * 这个获取的不准,请使用  getCurrentRunningPkg 函数
 * 取得当前运行的App包名
 * @return string
 * @return {null|string}
 */
function getRunningPkg() {
    if (isAccMode()) {
@@ -1575,7 +1613,7 @@
 * 取得当前运行的App包名
 * 这个是通过节点获取的,前提是需要打开自动化服务
 * 适配EC 10.6.0+
 * @return string
 * @return {null|string}
 */
function getCurrentRunningPkg() {
    if (isAccMode()) {
@@ -1589,7 +1627,7 @@
/**
 *
 *  @return bool 布尔型| true代表成功
 *  @return {boolean} 布尔型| true代表成功
 */
function home() {
    if (isAccMode()) {
@@ -1604,7 +1642,7 @@
/**
 * 返回桌面2
 * 适配EC 安卓 9.16.0+
 * @return {bool} true 代表成功
 * @return {boolean} true 代表成功
 */
function home2() {
    importClass(android.content.Intent);
@@ -1623,7 +1661,7 @@
/**
 * 分割屏幕
 * @return bool 布尔型| true代表成功
 * @return {boolean} 布尔型| true代表成功
 */
function splitScreen() {
    if (isAccMode()) {
@@ -1637,7 +1675,7 @@
/**
 * 模拟电源键
 * @return 布尔型 true 成功 false 失败
 * @return {boolean} true 成功 false 失败
 */
function power() {
    if (isAccMode()) {
@@ -1651,7 +1689,7 @@
/**
 * 打开快速设置
 * @return 布尔型 true 成功, else 失败
 * @return {boolean} true 成功, else 失败
 */
function openQuickSettings() {
    if (isAccMode()) {
@@ -1665,7 +1703,7 @@
/**
 * 打开通知栏
 *
 * @return 布尔型 true 成功, else 失败
 * @return {boolean} true 成功, else 失败
 */
function openNotification() {
    if (isAccMode()) {
@@ -1678,7 +1716,7 @@
/**
 * 返回按键
 * @return boolean|布尔型
 * @return {boolean}
 */
function back() {
    if (isAccMode()) {
@@ -1691,7 +1729,7 @@
/**
 * 最近APP任务按键
 * @return boolean|布尔型
 * @return {boolean}
 */
function recentApps() {
    if (isAccMode()) {
@@ -1705,7 +1743,7 @@
/**
 * 当前是否是我们的输入法
 * @return boolean|布尔型
 * @return {boolean}
 */
function currentIsOurIme() {
    if (isAccMode()) {
@@ -1721,7 +1759,7 @@
 * 通过Selector输入数据
 * @param selectors  选择器
 * @param content 数据字符串
 * @return boolean|布尔型
 * @return {boolean}
 */
function inputText(selectors, content) {
    if (isAccMode()) {
@@ -1737,7 +1775,7 @@
 * 通过选择器粘贴数据
 * @param selectors  选择器
 * @param content 数据字符串
 * @return boolean|布尔型
 * @return {boolean}
 */
function pasteText(selectors, content) {
    if (isAccMode()) {
@@ -1755,7 +1793,7 @@
 * @param selectors 选择器,可以为空,如果为空,前提是输入框是聚焦的状态
 * @param content 具体请看 KeyEvent.KEYCODE_*的值,例如66 = enter 67=del,84=SEARCH
 * 特殊代码: 1000: 模拟搜索按键,1001: 模拟完成按键 1002:模拟go按键,1003:模拟下一个按键,1004:模拟上一个按键 1005:模拟发送按键
 * @return {boolean|布尔型}
 * @return {boolean}
 */
function imeInputText(selectors, content) {
    if (selectors == null || selectors == undefined || selectors == "") {
@@ -1773,7 +1811,7 @@
 * 使用输入法输入内容时,输入法键盘视图是否展示出来
 * 前提:在EC 系统设置中,勾选了 显示输入法键盘
 * 适配EC 9.18.0+
 * @return {boolean|布尔型} true代表视图展示 false代表未展示
 * @return {boolean}true代表视图展示 false代表未展示
 */
function imeInputViewShown() {
    return acEventWrapper.imeInputViewShown();
@@ -1783,7 +1821,7 @@
 * 使用输入法输入内容,前提是已经设置本程序的输入法为默认输入法
 * @param selectors  选择器
 * @param content 整型,具体请看 KeyEvent.KEYCODE_*的值,例如66 = enter 67=del,84=SEARCH
 * @return boolean|布尔型
 * @return {boolean}
 */
function imeInputKeyCode(selectors, content) {
    if (selectors == null || selectors == undefined || selectors == "") {
@@ -1801,7 +1839,7 @@
/**
 * 清除文本数据
 * @param selectors 节点选择器
 *  @return boolean 布尔型| true代表成功
 *  @return {boolean} 布尔型| true代表成功
 */
function clearTextField(selectors) {
    if (isAccMode()) {
@@ -1819,7 +1857,7 @@
 * @param endX      结束的X坐标
 * @param endY      结束的Y坐标
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
function swipe(selectors, endX, endY, duration) {
    if (isAccMode()) {
@@ -1837,7 +1875,7 @@
 * @param endX   结束坐标的X轴值
 * @param endY   结束坐标的Y轴值
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 滑动成功, false 滑动失败
 * @return {boolean} true 滑动成功, false 滑动失败
 */
function swipeToPoint(startX, startY, endX, endY, duration) {
    if (isAccMode()) {
@@ -1854,7 +1892,7 @@
 * @param selectors 节点选择器
 * @param distance  滑动距离 单位是像素
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 滑动成功,false 滑动失败
 * @return {boolean} true 滑动成功,false 滑动失败
 */
function swipeFromDownToUp(selectors, distance, duration) {
    if (isAccMode()) {
@@ -1870,7 +1908,7 @@
 * @param selectors 节点选择器
 * @param distance  滑动距离 单位是像素
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 滑动成功,false 滑动失败
 * @return {boolean} true 滑动成功,false 滑动失败
 */
function swipeFromUpToDown(selectors, distance, duration) {
    if (isAccMode()) {
@@ -1887,7 +1925,7 @@
 * @param selectors 节点选择器
 * @param distance  滑动距离 单位是像素
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 滑动成功,false 滑动失败
 * @return {boolean} true 滑动成功,false 滑动失败
 */
function swipeFromRightToLeft(selectors, distance, duration) {
    if (isAccMode()) {
@@ -1903,7 +1941,7 @@
 * @param selectors 节点选择器
 * @param distance  滑动距离 单位是像素
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 滑动成功,false 滑动失败
 * @return {boolean} true 滑动成功,false 滑动失败
 */
function swipeFromLeftToRight(selectors, distance, duration) {
    if (isAccMode()) {
@@ -1918,7 +1956,7 @@
 * 向上滑动
 * @param distance 滑动距离 单位像素
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 成功,false 失败
 * @return {boolean} true 成功,false 失败
 */
function swipeFromDownToUpInScreen(distance, duration) {
    if (isAccMode()) {
@@ -1933,7 +1971,7 @@
 * 向下滑动
 * @param distance 滑动距离 单位像素
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
function swipeFromUpToDownInScreen(distance, duration) {
    if (isAccMode()) {
@@ -1948,7 +1986,7 @@
 * 向左滑动
 * @param distance 滑动距离 单位像素
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
function swipeFromRightToLeftInScreen(distance, duration) {
    if (isAccMode()) {
@@ -1963,7 +2001,7 @@
 * 向右滑动
 * @param distance 滑动距离 单位像素
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 代表成功 false 代表失败
 * @return {boolean} true 代表成功 false 代表失败
 */
function swipeFromLeftToRightInScreen(distance, duration) {
    if (isAccMode()) {
@@ -1978,7 +2016,7 @@
 * 是否滚动到底部了,如果查不到元素也会返回false
 * @param distance 滚动方向 UP,DOWN,LEFT,RIGHT
 * @param selectors 选择器
 * @return false 代表未滚动到位,true 代表滚动完成了
 * @return {boolean} false 代表未滚动到位,true 代表滚动完成了
 */
function isScrollEnd(distance, selectors) {
    if (isAccMode()) {
@@ -1997,7 +2035,7 @@
 * @param endX   结束坐标的X轴值
 * @param endY   结束坐标的Y轴值
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 拖动成功, false 拖动失败
 * @return {boolean} true 拖动成功, false 拖动失败
 */
function drag(startX, startY, endX, endY, duration) {
    if (isAccMode()) {
@@ -2013,7 +2051,7 @@
 * @param selectors 选择器 {@link S}
 * @param destObj   目标元素选择器
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 成功 false 失败
 * @return {boolean} true 成功 false 失败
 */
function dragTo(selectors, destObj, duration) {
    if (isAccMode()) {
@@ -2030,7 +2068,7 @@
 * @param endX      目标 X 坐标
 * @param endY      目标 Y 坐标
 * @param duration 持续时长 单位毫秒
 * @return 布尔型 true 成功 false 失败
 * @return {boolean} true 成功 false 失败
 */
function dragToPoint(selectors, endX, endY, duration) {
    if (isAccMode()) {
@@ -2048,7 +2086,7 @@
 * <Br/>
 * 兼容版本: Android 4.4 以上
 * @param timeout 请求权限超时时间 单位是秒
 * @return true 代表请求权限成功,false代表失败
 * @return {boolean} true 代表请求权限成功,false代表失败
 */
function requestFloatViewPermission(timeout) {
    return utils.requestFloatViewPermission(timeout);
@@ -2068,7 +2106,7 @@
 * y:整型 悬浮窗起始Y坐标
 * w:整型 悬浮窗起始宽度
 * h:整型 悬浮窗起始高度
 * @return true 代表请求权限成功,false代表失败
 * @return {boolean} true 代表请求权限成功,false代表失败
 */
function showFloatView(params) {
    return utils.showFloatView(params);
@@ -2078,7 +2116,7 @@
/**
 * 折叠日志悬浮窗,只保留标题
 * 适配EC 9.32.0+
 * @return true 成功,false代表失败
 * @return {boolean} true 成功,false代表失败
 */
function collapseLogView() {
    return utils.collapseLogView();
@@ -2087,7 +2125,7 @@
/**
 * 关闭浮窗
 * @param tag showFloatView 使用的tag参数,对悬浮窗唯一定位的
 * @return true 成功,false代表失败
 * @return {boolean} true 成功,false代表失败
 */
function closeFloatView(tag) {
    return utils.closeFloatView(tag);
@@ -2097,7 +2135,7 @@
/**
 * 展开日志悬浮窗
 * 适配EC 9.32.0+
 * @return true 成功,false代表失败
 * @return {boolean} true 成功,false代表失败
 */
function expandLogView() {
    return utils.expandLogView();
@@ -2105,7 +2143,7 @@
/**
 * 关闭所有悬浮窗,但不包含日志悬浮窗
 * @return true 成功,false代表失败
 * @return {boolean} true 成功,false代表失败
 */
function closeAllFloatView() {
    return utils.closeAllFloatView();
@@ -2154,7 +2192,7 @@
 *      title:日志框标题
 *      showTitle:是否显示标题
 *      backgroundImg 背景图片,放到工程的res文件夹,录入填写res/a.png
 * @return bool true代表成功,false代表失败
 * @return {boolean} true代表成功,false代表失败
 */
function setLogViewSizeEx(map) {
    return utils.setLogViewSizeEx(JSON.stringify(map));
@@ -2175,12 +2213,17 @@
 *      h:高度
 *      textSize:日志的字体大小
 *      backgroundColor:背景颜色,例如#336699
 * @return bool true代表成功,false代表失败
 * @return {boolean} true代表成功,false代表失败
 */
function setLogFixedViewEx(map) {
    return utils.setLogFixedViewEx(JSON.stringify(map));
}
/**
 * 设置日志固定栏目属性
 * @param msg string
 * @return {boolean}
 */
function setFixedViewText(msg) {
    return utils.setFixedViewText(msg);
}
@@ -2202,7 +2245,7 @@
 *      x: 起始X位置
 *      y: 起始Y位置
 *      backgroundColor:背景颜色,例如#336699
 * @return bool true代表成功,false代表失败
 * @return {boolean} true代表成功,false代表失败
 */
function setCtrlViewSizeEx(map) {
    return utils.setCtrlViewSizeEx(JSON.stringify(map));
@@ -2215,7 +2258,7 @@
 * 运行环境: 无限制
 * <Br/>
 * 兼容版本: Android 4.4 以上
 * @return true 有权限,false 代表无权限
 * @return {boolean} true 有权限,false 代表无权限
 */
function hasFloatViewPermission() {
    return utils.hasFloatViewPermission();
@@ -2227,6 +2270,7 @@
 * 运行环境: 无限制
 * <Br/>
 * 兼容版本: Android 4.4 以上
 * @return {boolean}
 */
function showLogWindow() {
    return utils.showLogWindow();
@@ -2259,6 +2303,7 @@
/**
 * 关闭启停浮窗
 * 兼容版本: Android 4.4 以上
 * @return {boolean}
 */
function closeCtrlWindow() {
    return utils.hideCtrlWindow();
@@ -2271,6 +2316,7 @@
 * 运行环境: 无限制
 * <Br/>
 * 兼容版本: Android 4.4 以上
 * @return {boolean}
 */
function closeLogWindow() {
    return utils.hideLogWindow();
@@ -2281,7 +2327,7 @@
 * @param msg 消息
 * @param color 颜色值例如  #ffffff
 * @param size 字体大小
 * @return {*}
 * @return {boolean}
 */
function setLogText(msg, color, size) {
    return utils.setLogText(msg, color, size);
@@ -2293,7 +2339,7 @@
 * 通过选择器 获取第一个节点信息
 * @param selectors 选择器
 * @param timeout
 * @return {NodeInfo} 对象或者null
 * @return {null|NodeInfo} 对象或者null
 */
function getOneNodeInfo(selectors, timeout) {
    if (isAccMode()) {
@@ -2307,7 +2353,7 @@
/**
 * 取得父级
 * @param nodeinfo NodeInfo对象
 * @return { NodeInfo} {NodeInfo 对象|null}
 * @return {null|NodeInfo} NodeInfo 对象|null
 */
function getNodeInfoParent(nodeinfo) {
    if (nodeinfo == null || nodeinfo.nid == null) {
@@ -2326,7 +2372,7 @@
 * 取得单个子节点
 * @param nodeinfo NodeInfo对象
 * @param index 子节点索引
 * @return {NodeInfo} {NodeInfo 对象|null}
 * @return {null|NodeInfo} NodeInfo 对象|null
 */
function getNodeInfoChild(nodeinfo, index) {
    if (nodeinfo == null || nodeinfo.nid == null) {
@@ -2344,7 +2390,7 @@
/**
 * 取得所有子节点
 * @param nodeinfo NodeInfo对象
 * @return {Array} NodeInfo 数组
 * @return {null|NodeInfo[]} NodeInfo 数组
 */
function getNodeInfoAllChildren(nodeinfo) {
    if (nodeinfo == null || nodeinfo.nid == null) {
@@ -2362,7 +2408,7 @@
/**
 * 当前节点的所有兄弟节点
 * @param nodeinfo NodeInfo对象
 * @return {Array} NodeInfo 数组
 * @return {null|NodeInfo[]} NodeInfo 数组
 */
function getSiblingNodeInfo(nodeinfo) {
    if (nodeinfo == null || nodeinfo.nid == null) {
@@ -2379,7 +2425,7 @@
/**
 * 在当前节点前面的兄弟节点
 * @param nodeinfo NodeInfo对象
 * @return NodeInfo 节点集合
 * @return {null|NodeInfo[]} 节点集合
 */
function getPreviousSiblingNodeInfo(nodeinfo) {
    if (nodeinfo == null || nodeinfo.nid == null) {
@@ -2396,7 +2442,7 @@
/**
 * 在当前节点后面的兄弟节点
 * @param nodeinfo NodeInfo对象
 * @return {Array} NodeInfo 数组
 * @return {null|NodeInfo[]} NodeInfo 数组
 */
function getNextSiblingNodeInfo(nodeinfo) {
@@ -2415,7 +2461,7 @@
 * 对某个节点输入数据
 * @param nodeinfo NodeInfo对象
 * @param content 数据字符串
 * @return {boolean|布尔型}
 * @return {boolean}
 */
function inputTextNodeInfo(nodeinfo, content) {
    if (isAccMode()) {
@@ -2431,7 +2477,7 @@
 * 对某个节点粘贴数据
 * @param nodeinfo NodeInfo对象
 * @param content 数据字符串
 * @return {boolean|布尔型}
 * @return {boolean}
 */
function pasteTextNodeInfo(nodeinfo, content) {
    if (isAccMode()) {
@@ -2446,7 +2492,7 @@
 * 使用输入法对某个节点输入数据,前提是已经设置本程序的输入法为默认输入法
 * @param nodeinfo NodeInfo对象
 * @param content 数据字符串
 * @return boolean|布尔型
 * @return {boolean}
 */
function imeInputTextNodeInfo(nodeinfo, content) {
    if (isAccMode()) {
@@ -2461,7 +2507,7 @@
 * 使用输入法对某个节点输入数据,前提是已经设置本程序的输入法为默认输入法
 * @param nodeinfo NodeInfo对象
 * @param content 具体请看 KeyEvent.KEYCODE_*的值,例如66 = enter 67=del,84=SEARCH
 * @return boolean|布尔型
 * @return {boolean}
 */
function imeInputKeyCodeNodeInfo(nodeinfo, content) {
    if (isAccMode()) {
@@ -2476,7 +2522,7 @@
/**
 * 清除节点文本数据
 *  @param nodeinfo NodeInfo对象
 *   @return bool 布尔型| true代表成功
 *  @return {boolean} 布尔型| true代表成功
 */
function clearTextFieldNodeInfo(nodeinfo) {
    if (isAccMode()) {
@@ -2501,7 +2547,7 @@
/**
 *  节点信息是否有效
 *  @param nodeinfo NodeInfo对象
 *  @return bool|布尔型 true代表有
 *  @return {boolean} true代表有
 */
function isValidNodeInfo(nodeinfo) {
    if (isAccMode()) {
@@ -2519,7 +2565,7 @@
 * @param fetchInvisibleNode 是否抓取隐藏的元素,默认不抓取
 * @param fetchNotImportantNode 是否抓取不重要的元素
 * @param algorithm 节点查找算法,默认是nsf,分别有 nsf = 节点静态算法,bsf= 广度优先, dsf=深度度优先
 * @return boolean|布尔型
 * @return {boolean}
 */
function setFetchNodeMode(mode, fetchInvisibleNode, fetchNotImportantNode, algorithm) {
    if (isAccMode()) {
@@ -2538,7 +2584,7 @@
 * @param data map格式 {"dumpMethod":1,"maxDepth":50}
 *      dumpMethod: NSF算法下的抓节点方式分别是1、2、3,默认是1
 *      maxDepth: 抓节点深度
 * @return boolean|布尔型
 * @return {boolean}
 */
function setNodeDumpParam(data) {
    if (isAccMode()) {
@@ -2556,7 +2602,7 @@
 * 适配 EC 9.23.0+
 * @param blockNode 字符串,以英文逗号分割,例如 clz,index,bounds,获取属性值,参考idea节点面板的右侧属性
 * blockNode 设置为 "" , 代表恢复默认
 * @return {boolean|*}
 * @return {boolean}
 */
function setBlockNodeAttr(blockNodeAttr) {
    if (isAccMode()) {
@@ -2570,7 +2616,7 @@
/**
 * 加上节点获取的某个标志位
 * @param flag 参见 AccessibilityServiceInfo.FLAG_*,如果是0是强制刷新
 * @return {null|boolean}
 * @return {boolean}
 */
function addNodeFlag(flag) {
    if (isAccMode()) {
@@ -2597,18 +2643,23 @@
/**
 * 转换成node inf的数组
 * @param d
 * @return NodeInfo {NodeInfo 数组 | null}
 * @return {null|NodeInfo[]} NodeInfo 数组 | null
 */
function nodeInfoArray(d) {
    if (d == null || d == "") {
        return null;
    }
    d = JSON.parse(d);
    var x = [];
    for (var i = 0; i < d.length; i++) {
        x.push(new NodeInfo(d[i]));
    try {
        d = JSON.parse(d);
        var x = [];
        for (var i = 0; i < d.length; i++) {
            x.push(new NodeInfo(d[i]));
        }
        return x;
    } catch (e) {
    }
    return x;
    return null;
}
@@ -2636,7 +2687,7 @@
/**
 * 创建一个多点触摸下一个对象
 *
 * @return MultiPoint 选择器对象
 * @return {MultiPoint} 选择器对象
 */
MultiPoint.prototype.next = function () {
    this.create();
@@ -2645,7 +2696,7 @@
/**
 * 动作,可以参考android的MotionEvent.ACTION_*
 * @param value 一般情况下 按下为0,弹起为1,移动为2
 * @return MultiPoint
 * @return {MultiPoint}
 */
MultiPoint.prototype.action = function (value) {
    if (this.m != null) {
@@ -2656,7 +2707,7 @@
/**
 * 按下动作
 * @return MultiPoint
 * @return {MultiPoint}
 */
MultiPoint.prototype.downAction = function () {
    this.action(0);
@@ -2665,7 +2716,7 @@
/**
 * 弹起动作
 * @return MultiPoint
 * @return {MultiPoint}
 */
MultiPoint.prototype.upAction = function () {
    this.action(1);
@@ -2674,7 +2725,7 @@
/**
 * 移动动作
 * @return MultiPoint
 * @return {MultiPoint}
 */
MultiPoint.prototype.moveAction = function () {
    this.action(2);
@@ -2685,7 +2736,7 @@
/**
 * 设置X坐标
 * @param value X坐标
 * @return MultiPoint
 * @return {MultiPoint}
 */
MultiPoint.prototype.x = function (value) {
    if (this.m != null) {
@@ -2696,7 +2747,7 @@
/**
 * 设置X坐标
 * @param value X坐标
 * @return MultiPoint
 * @return {MultiPoint}
 */
MultiPoint.prototype.y = function (value) {
    if (this.m != null) {
@@ -2718,7 +2769,7 @@
/**
 * 该动作延迟多少毫秒执行
 * @param value 延迟时间,单位是毫秒
 * @return MultiPoint
 * @return {MultiPoint}
 */
MultiPoint.prototype.delay = function (value) {
    if (this.m != null) {
@@ -2729,7 +2780,7 @@
/**
 * meta / modifier 键的状态,一般设置为0
 * @param value
 * @return MultiPoint
 * @return {MultiPoint}
 */
MultiPoint.prototype.metaState = function (value) {
    if (this.m != null) {
@@ -2843,26 +2894,56 @@
    return S.get().xpath(value);
}
/**
 *
 * @param value
 * @return {*S
 */
function row(value) {
    return S.get().row(value);
}
/**
 *
 * @param value
 * @return {S}
 */
function column(value) {
    return S.get().column(value);
}
/**
 *
 * @param value
 * @return {S}
 */
function rowSpan(value) {
    return S.get().rowSpan(value);
}
/**
 *
 * @param value
 * @return {S}
 */
function columnSpan(value) {
    return S.get().columnSpan(value);
}
/**
 *
 * @param value
 * @return {S}
 */
function rowCount(value) {
    return S.get().rowCount(value);
}
/**
 *
 * @param value
 * @return {S}
 */
function columnCount(value) {
    return S.get().columnCount(value);
}
@@ -3085,7 +3166,7 @@
 * @param touch2 第2个手指的触摸点数组
 * @param touch3 第3个手指的触摸点数组
 * @param timeout 多点触摸执行的超时时间,单位是毫秒,在无障碍模式下,这个参数不生效
 * @return boolean|布尔型
 * @return {boolean}
 */
function multiTouch(touch1, touch2, touch3, timeout) {
    if (isAccMode()) {
@@ -3099,7 +3180,7 @@
 * 取得某个范围的随机值
 * @param min 最小值
 * @param max 最大值
 * @return 整型 在min和max中间的值, 包含最大和最小值
 * @return {number} 在min和max中间的值, 包含最大和最小值
 */
function random(min, max) {
    return utils.getRangeInt(min, max);
@@ -3110,7 +3191,7 @@
 * @param tag 任务的唯一标示,不能为空,脚本中可以使用readConfigString("jobTaskTag")获取当前tag值,判断是那个任务过来执行的
 * @param execTime 定时时间格式: 2020-04-17 19:20:00,或者直接是秒数字,例如 3,代表3秒后
 * @param cancelBeforeRunning
 * @return 整型 jobid
 * @return {number} jobid
 */
function startJob(tag, execTime, cancelBeforeRunning) {
    return utilsWrapper.startJob(tag, execTime, cancelBeforeRunning);
@@ -3118,7 +3199,8 @@
/**
 * 取消所有定时任务
 * @return bool true 代表有任务被取消
 * @return {boolean} true 代表有任务被取消
 *
 */
function cancelAllJob() {
    return utilsWrapper.cancelAllJob();
@@ -3127,7 +3209,7 @@
/**
 * 通过tag对定时任务进行取消
 * @param tag tag名称
 * @return bool true 代表有任务被取消
 * @return {boolean} true 代表有任务被取消
 */
function cancelJob(tag) {
    return utilsWrapper.cancelJob(tag);
@@ -3135,7 +3217,7 @@
/**
 * 取得所有的定时任务标签
 * @return 字符串数组或者null
 * @return {null|JSON} 字符串数组或者null
 */
function getAllJobTag() {
    var x = utilsWrapper.getAllJobTag();
@@ -3234,6 +3316,11 @@
}
/**
 *
 * @param nodeinfo
 * @return {boolean}
 */
function clickExNodeInfo(nodeinfo) {
    if (isAccMode()) {
        return acEvent.clickExNodeInfo(nodeinfo.nid);
@@ -3242,6 +3329,24 @@
    }
}
/**
 *
 * @param nodeinfo
 * @return {boolean}
 */
function setFocusNodeInfo(nodeinfo) {
    if (isAccMode()) {
        return acEvent.setFocusNodeInfo(nodeinfo.nid);
    } else if (isAgentMode()) {
        return agentEvent.setFocusNodeInfo(nodeinfo.nid);
    }
}
/**
 *
 * @param nodeinfo
 * @return {boolean}
 */
function longClickExNodeInfo(nodeinfo) {
    if (isAccMode()) {
        return acEvent.longClickExNodeInfo(nodeinfo.nid);
@@ -3250,7 +3355,11 @@
    }
}
/**
 *
 * @param nodeinfo
 * @return {boolean}
 */
function scrollForwardNodeInfo(nodeinfo) {
    if (isAccMode()) {
        return acEvent.scrollForwardNodeInfo(nodeinfo.nid);
@@ -3259,6 +3368,11 @@
    }
}
/**
 *
 * @param nodeinfo
 * @return {boolean}
 */
function scrollBackwardNodeInfo(nodeinfo) {
    if (isAccMode()) {
        return acEvent.scrollBackwardNodeInfo(nodeinfo.nid);
@@ -3267,6 +3381,11 @@
    }
}
/**
 *
 * @param nodeinfo
 * @return {boolean}
 */
function scrollLeftNodeInfo(nodeinfo) {
    if (isAccMode()) {
        return acEvent.scrollLeftNodeInfo(nodeinfo.nid);
@@ -3303,7 +3422,7 @@
/**
 * 读取res文件夹中的资源文件,并返 AutoImage 图片对象
 * @param fileName 文件名称,不要加res前缀
 * @return AutoImage 如果是null代表没内容
 * @return {null|AutoImage} 如果是null代表没内容
 */
function readResAutoImage(fileName) {
    return image.readResAutoImage(fileName);
@@ -3312,7 +3431,7 @@
/**
 * 获取最近的节点事件处罚的时间,可通过时间判断节点服务是否可用
 *
 * @return {long} 长整型时间,毫秒级别
 * @return {number} 长整型时间,毫秒级别
 */
function lastNodeEventTime() {
@@ -3330,7 +3449,7 @@
 * @param x x坐标
 * @param y y坐标
 * @param delay 长按时间  毫秒
 * @return {bool} true 成功 false 失败
 * @return {boolean} true 成功 false 失败
 */
function press(x, y, delay) {
@@ -3348,7 +3467,7 @@
 * 适合EC 7.4.0+
 * @param x         x坐标
 * @param y         y坐标
 * @return 布尔型 true 代表成功 false代表失败
 * @return {boolean} true 代表成功 false代表失败
 */
function touchDown(x, y) {
    if (isAccMode()) {
@@ -3364,7 +3483,7 @@
 * 适合EC 7.4.0+
 * @param x         x坐标
 * @param y         y坐标
 * @return 布尔型 true 代表成功 false代表失败
 * @return {boolean} true 代表成功 false代表失败
 */
function touchMove(x, y) {
    if (isAccMode()) {
@@ -3380,7 +3499,7 @@
 * 适合EC 7.4.0+
 * @param x         x坐标
 * @param y         y坐标
 * @return 布尔型 true 代表成功 false代表失败
 * @return {boolean} true 代表成功 false代表失败
 */
function touchUp(x, y) {
    if (isAccMode()) {