全局快捷事件
说明
全局模块中封装的快捷事件,不用区分是无障碍模式还是代理模式
手势事件模式
setGestureActionMode 设置手势模式事件
- 设置各种手势模式事件的操作类型,默认是异步,目前只对无障碍模式有效
- @param mode 1 代表异步,2代表同步
- @param bool true代表成功 false代表失败
function main() {
setGestureActionMode(1);
// setGestureActionMode(2);
}
main();
点击函数
clickPoint 坐标点击
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 点击坐标
- @param x x坐标
- @param y y坐标
- @return
{boolean|布尔型}
function main() {
var result = clickPoint(100, 100);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
click 选择器点击
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 点击选择器
- @param selectors 选择器对象
- @return
{boolean|布尔型}
function main() {
var selector = text("我是文本");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
clickEx 无指针点击
- 执行条件:无障碍5.0以上或者手势执行为代理服务
- 无指针方式点击选择器,节点必须是可点击的才行(clickable = true)
- @param selectors 选择器对象
- @return
{boolean|布尔型}
function main() {
var selector = text("我是文本");
var result = clickEx(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
longClickEx 无指针长点击
- 执行条件:无障碍5.0以上或者手势执行为代理服务
- 无指针方式长点击选择器,节点必须是可点击的才行
- @param selectors 选择器对象
- @return
{boolean|布尔型}
function main() {
var selector = text("我是文本");
var result = longClickEx(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
clickRandom 选择器随机点击
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 随机点击选择器的任意元素
- @param selectors 选择器对象
- @return
{boolean|布尔型}
function main() {
var selector = text("我是文本");
var result = clickRandom(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
clickRandomEx 无指针随机点击
- 执行条件:无障碍5.0以上或者手势执行为代理服务
- 随机点击选择器的任意元素
- @param selectors 选择器对象
- @return
{boolean|布尔型}
function main() {
var selector = text("我是文本");
var result = clickRandomEx(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
clickRandomRect 区域随机点击
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 随机点击区域中的坐标
- @param rect 区域对象
- @return
{boolean|布尔型}
function main() {
var rect = new Rect();
rect.left = 10;
rect.right = 200;
rect.top = 10;
rect.bottom = 400;
var result = clickRandomRect(rect);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
clickCenter 点击中心点
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 点击区域中的中心坐标
- @param rect 区域对象
- @return
{boolean|布尔型}
function main() {
var rect = new Rect();
rect.left = 10;
rect.right = 200;
rect.top = 10;
rect.bottom = 400;
var result = clickCenter(rect);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
clickText 点击文本
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 点击文本
- @param text 文本
- @return
{boolean|布尔型}
function main() {
var result = clickText("设置");
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
longClick 选择器长点击
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 长点击选择器
- @param selectors 选择器对象
- @return
{boolean|布尔型}
function main() {
var selector = text("我是文本");
var result = longClick(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
longClickPoint 坐标长点击
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 长点击坐标
- @param x x坐标
- @param y y坐标
- @return
{boolean|布尔型}
function main() {
var result = longClickPoint(100, 100);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
press 坐标长按
- 长按住事件
- 适用版本(EC 5.15.0+)
- @param x x坐标
- @param y y坐标
- @param delay 长按时间 毫秒
- @return
{bool}
true 成功 false 失败
function main() {
var result = press(100, 100, 5000);
if (result) {
toast("长按成功");
} else {
toast("长按失败");
}
}
main();
多点触摸
multiTouch 多点触摸
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 多点触摸
- 触摸参数: action :一般情况下 按下为0,弹起为1,移动为2
- x: X坐标
- y: Y坐标
- pointer:设置第几个手指触摸点,分别是 1,2,3等,代表第n个手指
- delay: 该动作延迟多少毫秒执行,这个是值当前这个事件先延迟后执行
- @param touch1
第1个手指的触摸点数组,例如:
[{"action":0,"x":1,"y":1,"pointer":1,"delay":20},{"action":2,"x":1,"y":1,"pointer":1,"delay":20}]
- @param touch2 第2个手指的触摸点数组
- @param touch3 第3个手指的触摸点数组
- @param timeout 多点触摸总执行的超时时间,单位是毫秒
- @return boolean|布尔型
function main() {
utils.openAppByName("视频");
sleep(3000);
//第一种数组式的写法
var touch1 = [
{"action": 0, "x": 500, "y": 1200, "pointer": 1, "delay": 1},
{"action": 2, "x": 500, "y": 1100, "pointer": 1, "delay": 20},
{"action": 2, "x": 500, "y": 1000, "pointer": 1, "delay": 20},
{"action": 1, "x": 1, "y": 1, "pointer": 1, "delay": 20}
]
//第二种链式调用方法
var touch1 = MultiPoint
.get()
.action(0).x(500).y(1200).pointer(1).delay(1)
.next()
.action(2).x(500).y(1100).pointer(1).delay(1)
.next()
.action(2).x(500).y(1000).pointer(1).delay(1)
.next()
.action(2).x(500).y(900).pointer(1).delay(1)
.next()
.action(1).x(500).y(800).pointer(1).delay(1);
var touch2 = MultiPoint
.get()
.action(0).x(300).y(1200).pointer(2).delay(1)
.next()
.action(2).x(300).y(1100).pointer(2).delay(1)
.next()
.action(2).x(300).y(1000).pointer(2).delay(1)
.next()
.action(2).x(300).y(900).pointer(2).delay(1)
.next()
.action(1).x(300).y(800).pointer(2).delay(1);
var x = multiTouch(touch1, touch2, null, 30000);
logd("xxs " + x);
}
main();
touchDown 执行按下
- 执行按下
- 适合EC 7.4.0+,安卓版本8+
- @param x x坐标
- @param y y坐标
- @return 布尔型 true 代表成功 false代表失败
function main() {
//整个动作需要配合使用,单独无效
//按下
touchDown(100, 100)
sleep(50)
//移动
touchMove(100, 150)
sleep(50)
//移动
touchMove(100, 200)
sleep(50)
//抬起
touchUp(100, 200)
sleep(200)
}
main();
touchMove 执行移动
- 执行移动
- 适合EC 7.4.0+,安卓版本8+
- @param x x坐标
- @param y y坐标
- @return 布尔型 true 代表成功 false代表失败
function main() {
//整个动作需要配合使用,单独无效
//按下
touchDown(100, 100)
sleep(50)
//移动
touchMove(100, 150)
sleep(50)
//移动
touchMove(100, 200)
sleep(50)
//抬起
touchUp(100, 200)
sleep(200)
}
main();
touchUp 执行弹起
- 执行弹起事件
- 适合EC 7.4.0+,安卓版本8+
- @param x x坐标
- @param y y坐标
- @return 布尔型 true 代表成功 false代表失败
function main() {
//整个动作需要配合使用,单独无效
//按下
touchDown(100, 100)
sleep(50)
//移动
touchMove(100, 150)
sleep(50)
//移动
touchMove(100, 200)
sleep(50)
//抬起
touchUp(100, 200)
sleep(200)
}
main();
滚动函数
scrollForward 无指针向前滚动
- 执行条件:无障碍5.0以上或者手势执行为代理服务
- 向前滚动
- @param selectors 选择器对象
- @return
{boolean|布尔型}
function main() {
var selector = scrollable(true);
var result = scrollForward(selector);
if (result) {
toast("滚动成功");
} else {
toast("滚动失败");
}
}
main();
scrollBackward 无指针向后滚动
- 执行条件:无障碍5.0以上或者手势执行为代理服务
- 向后滚动
- @param selectors 选择器对象
- @return
{boolean|布尔型}
function main() {
var selector = scrollable(true);
var result = scrollBackward(selector);
if (result) {
toast("滚动成功");
} else {
toast("滚动失败");
}
}
main();
滑动函数
swipe 滑动
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 通过选择器滑动节点
- @param selectors 节点选择器
- @param endX 结束的X坐标
- @param endY 结束的Y坐标
- @param duration 持续时长 单位毫秒
- @return 布尔型 true 代表成功 false 代表失败
function main() {
var selectors = text("我是文本");
var result = swipe(selectors, 100, 100, 200);
if (result) {
toast("滑动成功");
} else {
toast("滑动失败");
}
}
main();
swipeToPoint 坐标点滑动
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 从一个坐标滑动到另一个坐标
- @param startX 起始坐标的X轴值
- @param startY 起始坐标的Y轴值
- @param endX 结束坐标的X轴值
- @param endY 结束坐标的Y轴值
- @param duration 持续时长 单位毫秒
- @return 布尔型 true 滑动成功, false 滑动失败
function main() {
var result = swipeToPoint(10, 10, 100, 100, 200);
if (result) {
toast("滑动成功");
} else {
toast("滑动失败");
}
}
main();
isScrollEnd 滚到底部判断
- 执行条件:无障碍5.0以上或者手势执行为代理服务
- 是否滚动到底部了,如果查不到元素也会返回false
- @param distance 滚动方向 UP,DOWN,LEFT,RIGHT
- @param selectors 选择器
- @return false 代表未滚动到位,true 代表滚动完成了
function main() {
var selectors = clz("android.widget.ListView");
var result = isScrollEnd("UP", selectors);
if (result) {
toast("滚动完成");
} else {
toast("滚动未完成");
}
}
main();
拖动函数
drag 拖动坐标
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 从一个坐标到另一个坐标的拖动
- @param startX 起始坐标的X轴值
- @param startY 起始坐标的Y轴值
- @param endX 结束坐标的X轴值
- @param endY 结束坐标的Y轴值
- @param duration 持续时长 单位毫秒
- @return 布尔型 true 拖动成功, false 拖动失败
function main() {
var result = drag(10, 10, 100, 100, 200);
if (result) {
toast("拖动成功");
} else {
toast("拖动失败");
}
}
main();
dragTo 拖动选择器
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 通过选择器拖动某个元素到目标元素
- @param selectors 选择器
- @param destObj 目标元素选择器
- @param duration 持续时长 单位毫秒
- @return 布尔型 true 成功 false 失败
function main() {
var selectors = text("设置");
var destObj = text("日历");
var result = dragTo(selectors, destObj, 200);
if (result) {
toast("拖动成功");
} else {
toast("拖动失败");
}
}
main();
dragToPoint 拖动到目标选择器
- 执行条件:无障碍7.0以上或者手势执行为代理服务
- 通过选择器拖动某个元素到目标X Y 坐标
- @param selectors 原始元素选择器
- @param endX 目标 X 坐标
- @param endY 目标 Y 坐标
- @param duration 持续时长 单位毫秒
- @return 布尔型 true 成功 false 失败
function main() {
var selectors = text("设置");
var result = dragToPoint(selectors, 100, 100, 200);
if (result) {
toast("拖动成功");
} else {
toast("拖动失败");
}
}
main();
输入数据
imeInputViewShown 输入法键盘是否展示
- 使用输入法输入内容时,输入法键盘视图是否展示出来
- 前提:在EC 系统设置中,勾选了 显示输入法键盘
- 适配EC 9.18.0+
- @return
{boolean|布尔型}
true代表视图展示 false代表未展示
function main() {
var result = imeInputViewShown();
if (result) {
toast("是");
} else {
toast("否");
}
}
main();
currentIsOurIme 是否是自带输入法
- 当前是否是我们的输入法
- @return
{boolean|布尔型}
function main() {
var result = currentIsOurIme();
if (result) {
toast("是");
} else {
toast("否");
}
}
main();
inputText 输入数据
- 执行条件:无障碍5.0以上
- 通过选择器输入数据
- @param selectors 选择器
- @param content 数据字符串
- @return
{boolean|布尔型}
function main() {
var selectors = clz("android.widget.EditText");
var result = inputText(selectors, "我是内容");
if (result) {
toast("是");
} else {
toast("否");
}
}
main();
imeInputText 输入法输入数据
- 使用输入法输入内容,前提是已经设置本程序的输入法为默认输入法
- 适合没有节点的情况,例如游戏等
- @param selectors 选择器,可以为空,如果为空,前提是输入框是聚焦的状态
- @param content 数据字符串, 特殊字符串解释: --ec_close_input-- 关闭软键盘,--ec_open_input-- 打开软键盘 ;--ec_show_input_view-- 显示键盘的视图,--ec_hide_input_view-- 不显示键盘的视图
- @return
{boolean|布尔型}
function main() {
// 打开软键盘
//imeInputText(null, "--ec_open_input--");
var selectors = clz("android.widget.EditText");
var result = imeInputText(selectors, "我是内容");
if (result) {
toast("是");
} else {
toast("否");
}
}
main();
imeInputKeyCode 输入法输入code
- 使用输入法输入内容,前提是已经设置本程序的输入法为默认输入法
- 适合没有节点的情况,例如游戏等
- @param selectors 选择器,可以为空,如果为空,前提是输入框是聚焦的状态
- @param content 具体请看 KeyEvent.KEYCODE_*的值,例如66 = enter 67=del,84=SEARCH
- 特殊代码: 1000: 模拟搜索按键,1001: 模拟完成按键 1002:模拟go按键,1003:模拟下一个按键,1004:模拟上一个按键 1005:模拟发送按键
- @return
{boolean|布尔型}
function main() {
// 模拟搜索按键
// imeInputKeyCode(null,1000);
var selectors = clz("android.widget.EditText");
var result = imeInputKeyCode(selectors, 66);
if (result) {
toast("是");
} else {
toast("否");
}
}
main();
pasteText 粘贴数据
- 执行条件:无障碍5.0以上
- 通过选择器粘贴数据
- @param selectors 选择器
- @param content 数据字符串
- @return
{boolean|布尔型}
function main() {
var selectors = clz("android.widget.EditText");
var result = pasteText(selectors, "我是内容");
if (result) {
toast("是");
} else {
toast("否");
}
}
main();
clearTextField 清除数据
- 执行条件:无障碍5.0以上
- @param selectors 节点选择器
- @return
{boolean|布尔型}
function main() {
var selectors = clz("android.widget.EditText");
var result = clearTextField(selectors);
if (result) {
toast("是");
} else {
toast("否");
}
}
main();
节点操作
lastNodeEventTime 最近节点事件发生时间
- 适用版本(EC 5.14.0+)
- 获取最近的节点事件触发的时间,可通过时间判断节点服务是否可用
- @return
{long}
长整型时间,毫秒级别
function main() {
startEnv();
logd("开始监听");
while (true) {
let d = lastNodeEventTime();
logd("time-" + d);
sleep(1000)
}
}
main();
setFocus 设置节点聚焦
- 设置节点聚焦
- 适配EC 10.21.0+
- @param selectors 选择器对象
- @return
boolean|布尔型
function main() {
var selectors = text("设置");
var result = setFocus(selectors);
if (result) {
toast("ok");
} else {
toast("false");
}
}
main();
has 节点存在判断
- 通过选择器判断元素是否存在
- @param selectors 选择器
- @return
{null|布尔型}
function main() {
var selectors = text("设置");
var result = has(selectors);
if (result) {
toast("存在节点");
} else {
toast("不存在节点");
}
}
main();
waitExistActivity 等界面出现
- 等待activity界面出现
- @param activity 界面名称
- @param timeout 超时时间,单位毫秒
- @return
{null|布尔型}
function main() {
var ac = "com.xxx.MainActivity";
var result = waitExistActivity(ac, 10000);
if (result) {
toast("存在界面");
} else {
toast("不存在界面");
}
}
main();
waitExistNode 等节点出现
- 通过选择器判断并等待元素是否存
- @param selectors 选择器
- @param timeout 超时时间,单位毫秒
- @return
{null|布尔型}
function main() {
var selectors = text("设置");
var result = waitExistNode(selectors, 10000);
if (result) {
toast("存在节点");
} else {
toast("不存在节点");
}
}
main();
getText 获取文本
- 获取选择器得到的文本数据
- @param selectors 选择器
- @return
{字符串数组|null|字符串集合}
function main() {
var selectors = clz("android.widget.TextView");
var result = getText(selectors);
toast("result:" + result);
}
main();
getNodeInfo 获取节点数组
- 获取节点信息
- @param selectors 选择器
- @param timeout 等待时间,单位是毫秒
- @return
{null|NodeInfo数组|节点信息集合}
function main() {
var result = getNodeInfo(clz("android.widget.TextView"), 10 * 1000);
toast("result:" + JSON.stringify(result));
}
main();
getNodeAttrs 节点属性信息
- 获取节点属性信息
- @param selectors 选择器
- @param attr 属性值,例如 text,className,更多的属性请参考NodeInfo对象属性
- @return
{null|字符串数组|Rect对象数组}
function main() {
var selectors = clz("android.widget.TextView");
//获取所有text属性
var result = getNodeAttrs(selectors, "text");
toast("result:" + result);
//获取所有bounds属性
result = getNodeAttrs(selectors, "bounds");
toast("result:" + result);
}
main();
getOneNodeInfo 获取单个节点
- 通过选择器 获取第一个节点信息
- @param selectors 选择器
- @param timeout 等待时间,单位是毫秒
- @return NodeInfo 对象或者null
function main() {
var result = getOneNodeInfo(clz("android.widget.TextView"), 10 * 1000);
toast("result:" + JSON.stringify(result));
if (result) {
result.click();
}
}
main();
setFetchNodeMode 获取节点的模式
- 设置获取节点的模式
- @param mode 1 是增强型, 2 是快速型,默认是增强型
- @param fetchInvisibleNode 是否抓取隐藏的元素,默认不抓取
- @param fetchNotImportantNode 是否抓取不重要的元素,默认抓取
- @param algorithm 节点查找算法,默认是nsf,分别有 nsf = 节点静态算法,bsf= 广度优先, dsf=深度度优先
- @return
{boolean}
function main() {
var result = setFetchNodeMode(1, false, true, "nsf");
toast("result:" + result);
}
main();
setNodeDumpParam 设置nsf抓节点参数
- 设置nsf抓节点参数
- 部分手机上使用NSF 读取节点会导致stackoverflow异常,可以使用dumpMethod设置为2或者3进行改善
- maxDepth参数用于控制节点深度,可以提高速度
- 适配EC 10.9.0+
- 不同的深度、抓节点方式,可以增加速度以及节点过多防止内存溢出问题
- @param data map格式
{"dumpMethod":1,"maxDepth":50}
- dumpMethod: NSF算法下的抓节点方式分别是1、2、3,默认是1
- maxDepth: 抓节点深度
- @return boolean|布尔型
function main() {
var result = setNodeDumpParam(1, false, true, "nsf");
toast("result:" + result);
logd(dumpXml())
}
main();
setBlockNodeAttr 屏蔽节点属性
- 设置要屏蔽的节点属性
- 设置后,系统不会抓取这些节点数据属性
- 适配 EC 9.23.0+
- @param blockNode 字符串,以英文逗号分割,例如 clz,index,bounds,获取属性值,参考idea节点面板的右侧属性
- blockNode 设置为 "" , 代表恢复默认
- @return
{boolean}
function main() {
var result = setBlockNodeAttr("row,bounds,index");
toast("result:" + result);
let data = dumpXml()
logd(data)
// 恢复默认
setBlockNodeAttr("")
}
main();
addNodeFlag 加上节点获取的某个标志位
- 加上节点获取的某个标志位
- @param flag 参见 AccessibilityServiceInfo.FLAG_*,如果是0是强制刷新
- @return
{null|boolean}
function main() {
addNodeFlag(0);
}
main();
removeNodeFlag 移除节点获取的某个标志位[强制刷新节点]
- 移除节点获取的某个标志位
- @param flag 参见 AccessibilityServiceInfo.FLAG_*,如果是0是强制刷新
function main() {
removeNodeFlag(0);
}
main();
dumpXml 元素变XML
- 将元素节点变成XML
- @return string string|null
function main() {
var result = dumpXml();
if (result) {
toast("ok");
} else {
toast("no");
}
}
main();
lockNode 锁定当前节点
- 锁定当前节点,锁定后,后面就算界面刷新,但是节点还是老的信息,需要和releaseNode进行配合才能进行解锁
function main() {
logd("锁住节点...")
//锁住节点,界面刷新也不动
console.time("1")
lockNode()
for (let i = 0; i < 10; i++) {
let n = text("设置").getOneNodeInfo(1000)
logd("lock " + n)
}
logd("释放节点锁...")
//释放节点锁
releaseNode()
logd(console.timeEnd("1"))
console.time("1")
for (var i = 0; i < 10; i++) {
let n = text("设置").getOneNodeInfo(1000)
logd("unlocked " + n)
}
logd(console.timeEnd("1"))
//锁住时间明显更短
}
main();
releaseNode 释放节点的锁
- 释放节点的锁,释放后,当界面刷新的时候,节点信息会变成最新的
function main() {
logd("锁住节点...")
//锁住节点,界面刷新也不动
console.time("1")
lockNode()
for (let i = 0; i < 10; i++) {
let n = text("设置").getOneNodeInfo(1000)
logd("lock " + n)
}
logd("释放节点锁...")
//释放节点锁
releaseNode()
logd(console.timeEnd("1"))
console.time("1")
for (var i = 0; i < 10; i++) {
let n = text("设置").getOneNodeInfo(1000)
logd("unlocked " + n)
}
logd(console.timeEnd("1"))
//锁住时间明显更短
}
main();
系统按键相关
home 返回主页
- 执行条件:无障碍5.0以上或者手势执行为代理服务
- 返回主页
- @return
{null|布尔型}
function main() {
var result = home();
if (result) {
toast("