找回密码
 立即注册
产品售前咨询QQ2050858539
全球IP代理EasyClick 一键安装包
查看: 542|回复: 4

[教程] 超级实用工具类,开发效率提高至少一倍,慢慢更新

[复制链接]

2

主题

2

回帖

31

积分

新手上路

积分
31
在线时间
3 小时
最后登录
2023-4-19
发表于 2022-10-18 15:24:37 | 显示全部楼层 |阅读模式

马上注册,结交朋友,共同学习EasyClick

您需要 登录 才可以下载或查看,没有账号?立即注册

×
const myUtils = {
    滑动到底部(x1, y1, x2, y2, wait, second, msg) {
        this.等待出现(() => {
            swipeToPoint(x1, y1, x2, y2, 200)
            second ? sleep(second * 1000) : sleep(100)
        }, wait, msg)
    },
    点节点坐标(node) {
        if (node && node.bounds) {
            const bounds = node.bounds
            clickPoint((bounds.right + bounds.left) / 2, (bounds.bottom + bounds.top) / 2)
        } else {
            toast("节点不存在,无法点击")
        }
    },
    getOneNodeInfo_(selector) {
        return getOneNodeInfo(selector, 1000 * 10)
    },
    级联关系拿节点(selector, str) {
        return this.级联关系拿节点_node_str(this.getOneNodeInfo_(selector), str)
    },
    级联关系拿节点_node_str(node, str) {
        return this.级联关系拿节点_node_arr(node, str.split("."))
    },
    /**
     * @param arr (f:父,z:子,x:兄) 例如 ["f","f","z0","x1"] = node.parent().parent().child(0).siblings()[1] z0可以省略为z
     */
    级联关系拿节点_node_arr(node, arr) {
        logd(JSON.stringify(node))
        logd(arr)
        if (!node) {
            return false
        }
        // 如果级联的父子兄有一个在当前界面不存在则返回false,避免抛出异常导致脚本停止
        for (let i = 0; i < arr.length; i++) {
            let item = arr
            logd("item:", item)
            let resNode = this.item转node(node, item)
            logd("resNode:" + JSON.stringify(resNode))
            if (resNode) {
                node = resNode
            } else {
                return false
            }
        }
        return node
    },
    item转node(node, item) {
        const itemNum = item.replace(/[fzx]/, "")
        logd("itemNum:" + itemNum)
        if (item === "f") {
            return node.parent()
        } else if (item.indexOf("z") !== -1) {
            if (itemNum) {
                return node.child(parseInt(itemNum))
            } else {
                return node.child(0)
            }
        } else if (item.indexOf("x") !== -1) {
            if (itemNum) {
                return node.siblings()[(parseInt(itemNum))]
            } else {
                return node.siblings()[0]
            }
        }
    },
    a到b_找图(handle, pic1, pic2, second) {
        this.a到b(handle, () => this.找图(pic1).isSuccess, () => this.找图(pic2).isSuccess, second)
    },
    找图(pic, isClick) {
        logd("pic:"+pic)
        // 需要保证已经初始化赋予了截图权限
        let res = {isSuccess: false, point: {x: -1, y: -1}}
        //从工程目录下res文件夹下读取sms.png文件
        let sms = readResAutoImage(pic);
        //抓取屏幕
        let aImage = image.captureFullScreen();
        logd("aimage " + aImage);
        if (aImage != null) {
            //在图片中查找
            let points = image.findImage(aImage, sms, 0, 0, 0, 0, 0.7, 0.9, 21, 5);
            logd("points " + JSON.stringify(points));
            //这玩意是个数组
            if (points && points.length > 0) {
                let point = points[0]
                let x = parseInt((point.left + point.right) / 2)
                let y = parseInt((point.top + point.bottom) / 2)
                res.isSuccess = true
                res.point.x = x
                res.point.y = y
                if (isClick) {
                    clickPoint(x, y)
                }
            }
            //图片要回收
            image.recycle(aImage)
        }
        //图片要回收
        image.recycle(sms)
        return res
    },
    a到b_节点_多步骤(selectorArr, second) {
        for (let i = 0; i < selectorArr.length; i++) {
            logd(i)
            let selectorA = selectorArr[i + 1 - 1]
            if (i < selectorArr.length - 1) {
                let selectorB = selectorArr[i + 1]
                this.a到b_节点(selectorA, selectorB, second)
            } else {
                logd("break")
                break
            }
        }
    },
    a到b_节点(selectorA, selectorB, second) {
        this.a到b(() => click(selectorA), () => has(selectorA), () => has(selectorB), second ? second : false)
    },
    a到b(handle, aFun, bFun, second) {
        while (true) {
            if (bFun()) {
                break
            } else if (aFun()) {
                handle()
            } else {
                logd("else")
            }
            second ? sleep(second * 1000) : sleep(1000)
        }
    },
    等待出现_节点(handle, selector, msg) {
        this.等待出现(handle, () => has(selector), msg ? () => toast(msg) : false)
    },
    等待出现(handle, wait, msg) {
        while (true) {
            if (wait()) {
                break
            } else {
                handle()
                msg ? msg() : ""
            }
        }
    }
}

function main() {
    init()
    const selectors = {
        界面A() {
            return text("界面A")
        },
        界面B() {
            return text("界面B")
        },
        界面C() {
            return text("界面C")
        },
        界面D() {
            return text("界面D")
        },
    }
    /*如果中途没有其他操作,可使用该函数*/
    myUtils.a到b_节点_多步骤([selectors.界面A(), selectors.界面B(), selectors.界面C(), selectors.界面D()])

    /*单独使用*/
    myUtils.a到b_节点(selectors.界面A(), selectors.界面B())
    //业务逻辑
    myUtils.a到b_节点(selectors.界面B(), selectors.界面C())
    //业务逻辑
    myUtils.a到b_节点(selectors.界面C(), selectors.界面D())
    //业务逻辑

    /*等待节点出现*/
    myUtils.等待出现_节点(() => {
        //业务逻辑
    }, selectors.界面A(), "等待xxx出现")

    /*级联拿节点*/
    // 等同于 text("界面A").parent().child(0).child(2).siblings()[1]
    // 报错返回false,不会停止线程
    const resNode = myUtils.级联关系拿节点(selectors.界面A(), "f.z0.z2.x1")
    logd(JSON.stringify(resNode))

    /*截图a到b*/
    myUtils.a到b_找图(()=>{
        myUtils.找图("a.png",true)
    },"a.png","b.png")
}

function init(){
    let  request = image.requestScreenCapture(10000,0);
    if (request){
        toast("申请成功");
    }else {
        toast("申请失败");
        exit();
    }
    let d= image.initOpenCV();
    logd(d)
    //申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
    sleep(1000)
    //开始再这里编写代码了!!
}
————————————————
版权声明:本文为CSDN博主「绅士1993」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aitanxiaofeng/article/details/127385855

0

主题

4

回帖

56

积分

注册会员

积分
56
在线时间
7 小时
最后登录
2026-5-10
发表于 2022-10-18 20:09:28 | 显示全部楼层
赞一个,再举个实例就更好了
回复

使用道具 举报

2

主题

2

回帖

31

积分

新手上路

积分
31
在线时间
3 小时
最后登录
2023-4-19
 楼主| 发表于 2022-10-19 14:13:56 | 显示全部楼层
liuqiming 发表于 2022-10-18 20:09
赞一个,再举个实例就更好了

main函数不就是实例嘛
回复

使用道具 举报

1

主题

8

回帖

107

积分

注册会员

积分
107
在线时间
9 小时
最后登录
2025-8-19
发表于 2023-12-27 17:40:59 | 显示全部楼层
赞一个赞一个赞一个赞一个
回复

使用道具 举报

1

主题

5

回帖

96

积分

注册会员

积分
96
在线时间
8 小时
最后登录
2024-11-14
发表于 2024-10-18 16:34:24 | 显示全部楼层
赞一个赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EasyClick技术交流站 ( 皖ICP备2023020527号-4 )

GMT+8, 2026-8-22 02:23 , Processed in 0.116516 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表