EasyClick 笔记

EasyClick 笔记

官方文档

EasyClick 笔记

一、常用命令1.获取选择器1)通过ID获取选择器2)通过text获取选择器3)通过desc获取选择器4)通过多个属性,联合获取选择器

2.获取结点1)获取父节点2)获取子节点2)获取全部子节点

3.操作1)点击a 结点范围内随机点击 clickb 结点中心点点击 clickCenterc 结点长按点击 longClickd 坐标点击 clickPointe 选择器随机点击 clickRandomf 区域随机点击 clickRandomRectg 坐标长按 press

2)结点输入 inputText3)滑动a 选择器滑动 swipeb 坐标点滑动 swipeToPoint

4)拖动a 拖动坐标 dragb 拖动选择器 dragToc 拖动选择器到目标dragToPoint

4.事件1)结点事件 has2)结点事件 waitExistNode3)结点事件 waitExistActivity

5.页面函数1)添加页面页签2)设置参数3)获取参数

6.后端函数1)页面参数a 获取页面参数b 修改页面参数c 删除页面参数

2)常用函数a 随机数 randomb 设备函数 device 类c 返回主页 homed 返回键 backe 启动appf 启动脚本 startg 停止脚本 exit

3)图色函数 image 类a 获取权限b 截取屏幕到文件 image.captureToFilec 自动截屏单点找色 image.findColorExd 自动截屏多点找色 image.findMultiColorExe 自动截屏找图 image.findImageEx

一、常用命令

1.获取选择器

1)通过ID获取选择器

// 通过id获取选择器

let idSelector = id("结点抓取中的id内容");

if(idSelector) {

logd("存在节点");

} else {

logd("不存在结点");

}

2)通过text获取选择器

// 通过id获取选择器

let idSelector = text("结点抓取中的text内容");

if(idSelector) {

logd("存在节点");

} else {

logd("不存在结点");

}

3)通过desc获取选择器

// 通过id获取选择器

let idSelector = desc("结点抓取中的desc内容");

if(idSelector) {

logd("存在节点");

} else {

logd("不存在结点");

}

4)通过多个属性,联合获取选择器

// 使用该方法,可以提高查找精度

let idSelector = id("结点抓取中的id内容").text("结点抓取中的text内容");

if(idSelector) {

logd("存在节点");

} else {

logd("不存在结点");

}

2.获取结点

结点信息 比较重要的结点属性如下:

id: 字符串,资源的IDclz: 字符串,视图类名,例如 android.widget.TextViewdesc: 字符串,内容描述text: 字符串,文本bounds: Rect型,空间对象

top: 整型,顶部位置bottom: 整型,底部位置eft: 整型,左边位置right: 整型,右边位置

// 通过第一步中的选择器,再获取结点信息。然后使用结点进行操作。

// 1000代表 延时1000毫秒即一秒后,得到改结点

let node = 选择器.getOneNodeInfo(1000); // 获取一个结点

let node = 选择器.getNodeInfo(1000); // 获取多个结点

if(node) {

logd("结点存在");

} else {

logd("结点不存在");

}

1)获取父节点

let node = id("结点抓取中的id内容").getOneNodeInfo(10000);

if (node) {

var x = node.parent();

logd(x);

} else {

toast("无节点");

}

2)获取子节点

let node = id("结点抓取中的id内容").getOneNodeInfo(10000);

if (node) {

var x = node.child(0);

logd(x);

} else {

toast("无节点");

}

2)获取全部子节点

let node = clz("android.widget.ViewGroup").getOneNodeInfo(10000);

if (node) {

let x = node.allChildren();

//这玩意是个数组

for(let i=0;i

logd(x[i])

}

} else {

toast("无节点");

}

3.操作

1)点击

点击文档

a 结点范围内随机点击 click

注意:因为的范围内随机,所以可能存在点击无效情况

// 选择器的点击操作

let result = click(选择器);

if(result) {

logd("点击成功");

} else {

logd("点击失败");

}

// 结点的点击操作

let result = 结点.click();

if(result) {

logd("点击成功");

} else {

logd("点击失败");

}

b 结点中心点点击 clickCenter

// 代码同上,换个方法

c 结点长按点击 longClick

注意:因为的范围内随机,所以可能存在点击无效情况

// 代码同上,换个方法

d 坐标点击 clickPoint

注意:通常配合结点的方位进行设置坐标值

let node = 选择器.getOneNodeInfo(1000);

let x = (node.bounds.right - node.bounds.left) / 2 + node.bounds.left;

let y = (node.bounds.bottom- node.bounds.top) / 2 + node.bounds.top;

let result = clickPoint(x, y);

if (result){

toast("点击成功");

} else {

toast("点击失败");

}

e 选择器随机点击 clickRandom

注意:也会存在点击不中的情况。需要重试

let idSelector = id("结点抓取中的id内容");

let result = clickRandom(idSelector);

if (result){

toast("点击成功");

} else {

toast("点击失败");

}

f 区域随机点击 clickRandomRect

注意:也会存在点击不中的情况。需要重试

let result = clickRandomRect(结点.bounds);

if (result){

toast("点击成功");

} else {

toast("点击失败");

}

g 坐标长按 press

注意:一般配合结点使用,单独使用也可以。需要相对坐标。不会受机型影响。

let node = 选择器.getOneNodeInfo(1000);

let x = (node.bounds.right - node.bounds.left) / 2 + node.bounds.left;

let y = (node.bounds.bottom- node.bounds.top) / 2 + node.bounds.top;

var result = press(x, y, 3000); // 3000为长按时间,3秒

if (result){

toast("长按成功");

} else {

toast("长按失败");

}

2)结点输入 inputText

// 结点必须为可输入结点

let result = 结点.inputText("内容");

if(result) {

logd("输入成功");

} else {

logd("输入失败");

}

3)滑动

a 选择器滑动 swipe

let selectors = id("我是id");

let result = swipe(selectors, 100, 100, 200);

if (result){

toast("滑动成功");

} else {

toast("滑动失败");

}

b 坐标点滑动 swipeToPoint

@param startX 起始坐标的X轴值@param startY 起始坐标的Y轴值@param endX 结束坐标的X轴值@param endY 结束坐标的Y轴值@param duration 持续时长 单位毫秒

let result = swipeToPoint(10, 10, 100, 100, 200);

if (result){

toast("滑动成功");

} else {

toast("滑动失败");

}

4)拖动

a 拖动坐标 drag

let result = drag(10,10,100,100,200);

if (result){

toast("拖动成功");

} else {

toast("拖动失败");

}

b 拖动选择器 dragTo

let selectors = text("设置");

let destObj = text("日历");

let result = dragTo(selectors,destObj,200);

if (result){

toast("拖动成功");

} else {

toast("拖动失败");

}

c 拖动选择器到目标dragToPoint

let selectors = text("设置");

let result = dragToPoint(selectors,100,100,200);

if (result){

toast("拖动成功");

} else {

toast("拖动失败");

}

4.事件

1)结点事件 has

特点:判断时间很快,如果在页面跳转中,需要注意响应时间。或者只用循环等待。需要配合 死循环与sleep使用更佳。

// 节点存在判断

let result = has(选择器);

if (result){

toast("存在节点");

} else {

toast("不存在节点");

}

2)结点事件 waitExistNode

特点:如果在超时时间内没有发现结点,则程序继续执行。将不会再次执行该方法。配合死循环可以重复执行。类似自带sleep

// waitExistNode 等节点出现,

var result = waitExistNode(选择器, 10000);

if (result){

toast("存在界面");

} else {

toast("不存在界面");

}

3)结点事件 waitExistActivity

// waitExistActivity 等界面出现

var ac = "com.xxx.MainActivity"; // 结点抓取中的 activity-class 属性内容

var result = waitExistActivity(ac, 10000);

if (result){

toast("存在界面");

} else {

toast("不存在界面");

}

5.页面函数

1)添加页面页签

在 layout》ui.js中添加

// 第一个参数:页签名称

// 第二个参数:页面相对路径

ui.layout("页签名称", "other.html");

2)设置参数

// 保存参数

window.ec.saveConfig("key", value);

3)获取参数

// 当前页面获取参数

let value = window.ec.getConfig("key");

6.后端函数

1)页面参数

a 获取页面参数

// 获取页面设置的参数

let value = readConfigString("key");

let value = readConfigInt("key");

let value = readConfigBoolean("key");

let value = readConfigDouble("key");

// 获取全部内容

let all= getConfigJSON();

b 修改页面参数

// 修改页面设置的参数

let r = updateConfig("key", value);

c 删除页面参数

// 删除页面设置的参数

let r = deleteConfig("key");

2)常用函数

a 随机数 random

// 随机从获取[100, 1000]中获取一个数字

var result = random(100, 1000);

logd(result);

b 设备函数 device 类

设备函数

// 屏幕宽度(一般定义为全局常量)

const width = device.getScreenWidth();

// 屏幕高度(一般定义为全局常量)

const height = device.getScreenHeight();

c 返回主页 home

let result = home();

if (result){

toast("成功");

} else {

toast("失败");

}

d 返回键 back

let result = back();

if (result){

toast("成功");

} else {

toast("失败");

}

e 启动app

// 通过包名打开

let result = utils.openApp("app包名");

if (result){

toast("成功");

} else {

toast("失败");

}

// 通过APP名称打开

let result = utils.openAppByName("app应用名称");

if (result){

toast("成功");

} else {

toast("失败");

}

f 启动脚本 start

// 前端调用

javascript:window.ec.start()

// 后端调用

start();

g 停止脚本 exit

exit();

3)图色函数 image 类

a 获取权限

let request = image.requestScreenCapture(10000, 0);

if(!request){

loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")

exit()

}

//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图

sleep(1000)

b 截取屏幕到文件 image.captureToFile

@param retryNumber 重试次数,直到能截到图为止,默认是3 @param x 截图的起始X坐标 @param y 截图的起始Y坐标 @param ex 终点X坐标 @param ey 终点Y坐标 @param path 截图保存路径(注意:模拟器与真机的起始路径不一样)

let node = 选择器.getOneNodeInfo(10000);

// 截取区域

var cap = image.captureToFile(3, node.bounds.left, node.bounds.top, node.bounds.right, node.bounds.bottom, "/sdcard/a"+i+".png");

if(cap) {

logd("截取成功");

} else {

logd("截取失败");

}

sleep(1000)

c 自动截屏单点找色 image.findColorEx

@param firstColor 第一个点的颜色 @param threshold 找色时颜色相似度取值为 0.0 ~ 1.0 @param points 字符串类似这样 6|1|0x969696-0x000010,1|12|0x969696,-4|0|0x969696 @param x 区域的X起始坐标 @param y 区域的Y起始坐标 @param ex 终点X坐标 @param ey 终点Y坐标 @param limit 限制个数 @param orz 方向,分别从1-8 @return 多个Point 坐标点数组或者null

let node = 选择器.getOneNodeInfo(10000);

let firstColor = "#58C7C7-#1A1B1F";

let points = image.findColorEx(firstColor, 0.9, node.bounds.left, node.bounds.top, node.bounds.right, node.bounds.bottom, 10, 1);

//这玩意是个数组(数组的个数,为上面 limit的入参)

if (points) {

logd("确定颜色");

logd("points " + JSON.stringify(points));

}

d 自动截屏多点找色 image.findMultiColorEx

与单点找色类似

let node = 选择器.getOneNodeInfo(10000);

// 颜色入参,用逗号隔开

let firstColor = "#5ACCCC-#1A1B1F,#FFFFFF-#1A1B1F";

let points = image.findColorEx(firstColor, 0.9, node.bounds.left, node.bounds.top, node.bounds.right, node.bounds.bottom, 10, 1);

//这玩意是个数组

if (points) {

logd("points " + JSON.stringify(points));

}

e 自动截屏找图 image.findImageEx

//从工程目录下res文件夹下读取sms.png文件

let smallTmplate = readResAutoImage("这个填写res文件夹下的文件名称");

//抓取屏幕

let screenImage = image.captureFullScreen();

if (screenImage != null) {

//在图片中查找

let points = image.findImage(screenImage, smallTmplate, 0, 0, 0, 0,0.7, 0.9, 10, 5);

//这玩意是个数组

if (points) {

logd("points " + JSON.stringify(points));

}

//图片要回收

image.recycle(screenImage)

}

//图片要回收

image.recycle(smallTmplate)

🎨 相关创意作品

海信液晶电视售后维修几年有效?全面解析官方保修政策与用户保障
碧蓝航线改造图鉴大全 改造船效果强度时装一览
“百年蔗”——甘蔗属中国种的传奇
365bat提现

“百年蔗”——甘蔗属中国种的传奇

📅 08-16 👁️ 175