Autojs常用方法&原始方法整理
概述:
Autojs有很多函数方法可以使用,但有部分不是很常用,今天对常用部分的方法整理方便以后查看,快速的的上手。
1、app应用相关
//================================app应用:===================================== launchApp('微信'); //通过app应用名启动应用 launch('com.tencent.mm'); //通过包名启动应用 app.uninstall('包名'); //卸载app var packageName=getPackageName('微信'); //通过应用名获取app包名 console.log("获取的包名:%s",packageName); var appname=getAppName("com.tencent.mm"); //通过包名返回应用名 console.log("获取的应用名:%s",appname); //格式化输出 //打开应用的详情页(设置页),,如果找不到该应用,返回false; 否则返回true。 app.openAppSetting("com.tencent.mm"); app.viewFile("/sdcard/test.txt"); //打开文件 //打开Url(如果不以"http://"或"https://"开头则默认是"http://") app.openUrl("https://www.wuyunai.com/docs/v8/")
2、控制台相关
//=================================控制台====================================== //格式化输出 let count = 5; let count1 = 10; console.log('以整型方式输出count: %d', count+count1); console.log('以字符串方式输出count: count=%s,count1=%d', count,count1); console.log('count:', count); //输出日志颜色 console.verbose("灰色字体显示日志"); console.info("绿色字体显示日志"); console.warn("蓝色字体显示日志"); console.error("红色字体显示日志"); //其他 toastLog('hallo word'); //toast提示+log记录 log("日志信息");//日志输出(console.log和log是一样的) alert("标题","内容"); //对话框输出 //控制台断言(如果value为false则输出错误信息message并停止脚本运行。) var a = 1 + 1; console.assert(a == 2, "加法出错啦,停止脚本运行"); //设置控制台大小为屏幕的四分之一 console.show(); console.setSize(device.width / 2, device.height / 2); //设置日志保存的路径和配置 console.setGlobalLogConfig({ "file": "/sdcard/1.txt" });
3、设备相关
//================================设备相关===================================== ////设置无障碍模式 fast为启用缓存 auto(); a = device.height; //高度 b = device.width; //宽度 console.log('设备分辨率:'+b+'*'+a); console.log("设备分辨率:%d *%d",a,b); brand = device.brand; //品牌厂商 console.log(brand); model = device.model; // 设备型号 console.log(model); product = device.product; // 手机型号名称 console.log(product); //硬件序列号 serial = device.serial; // c3ba6d87a0d71433 console.log(serial); //安卓系统API版本 sdkint = device.sdkInt; //API版本:25 console.log('API'+sdkint); //系统版本号 release = device.release; //7.1.2 console.log(release); //安卓id getandroidid = device.getAndroidId(); //71433c3ba6d87a0d console.log(getandroidid); //MAC地址 需要联网才能获取 getmacaddress = device.getMacAddress(); //B0:FC:36:12:C9:EF console.log(getmacaddress); //获取媒体音量 getmusicvolume = device.getMusicVolume(); console.log('音量'+getmusicvolume); //音量:大小 //获取电量百分比 getbattery = device.getBattery(); //87 console.log(getbattery); //确认设备是否在充电 ischarging = device.isCharging(); console.log(ischarging); //flase 没有在充电 //获取设备运行内存容量(占用的内存) gettotalmem = device.getTotalMem(); console.log(gettotalmem); //3186032640 单位(字节),可以自己转换 //获取设备当前可用内存 getavailmem = device.getAvailMem(); console.log(getavailmem); //2386280448(字节),可以自己转换 //查看屏幕是否亮着 isscreenon = device.isScreenOn(); console.log(isscreenon); //true //唤醒设备。包括唤醒设备CPU、屏幕等(如果息屏可以点亮屏幕,亮屏就依然亮屏) device.wakeUp(); //如果屏幕没有点亮,则唤醒设备 device.wakeUpIfNeeded() //保持点亮屏幕(设置时间) device.keepScreenOn(30000); //不加参数常亮, 手机亮屏时间以device.keepScreenOn为准,之前系统设置的时间作废 //保持屏幕常亮 可调节省电模式 device.keepScreenDim(timeout); //取消设备保持唤醒状态 用来取消屏幕的唤醒状态 device.cancelKeepingAwake(); ////使设备震动一段时间 device.vibrate(300); //单位毫秒 //取消震动 device.cancelVibration();
4、坐标操作
setScreenMetrics(width, height) //在width*height的设备中,坐标操作自适应 click(x, y)//点击 longClick(x, y)//长按 press(x, y, duration)//按住 swipe(x1, y1, x2, y2, duration)//滑动 swipeEx(x1, y1, x2, y2, duration)//仿真随机曲线滑动 gesture(duration, [x1, y1], [x2, y2], …)//手势路径,时长2s gestures([delay1, duration1, [x1, y1], [x2, y2], …], [delay2, duration2, [x3, y3], [x4, y4], …], …)//延时多点手势路径 //获取并点击屏幕的中心位置 x = device.width/2; //宽度x y = device.height/2; //高度y longClick(x, y)//长按
5、虚拟按键
//______________________按键模拟_物理按键的全局函数_______________________________________________ //设置无障碍模式 fast为启用缓存 auto(); //以上函数都可以放在toast()或log()里, 例如:toast(notifications()); back();//返回,返回是否执行成功 home();//回到桌面,返回是否执行成功 powerDialog();//弹出电源键菜单。返回是否执行成功 notifications();//拉出通知栏。返回是否执行成功 quickSettings();//下拉通知栏到底。返回是否执行成功 recents();//显示最近任务。返回是否执行成功 splitScreen();//分屏 KeyCode(code); //模拟物理按键,需要参考KeyCode对照表( https://blog.csdn.net/yaoyaozaiye/article/details/122826340 )
6、文件相关
//================================文件相关===================================== log(files.exists("/sdcard/test.txt"));//返回文件是否存在 log(files.isDir("/sdcard/test.txt")); //返回路径path是否为目录 console.log(files.isFile("/sdcard/test.txt")); //返回路径path是否为文件 console.log("文件夹是否为空:",files.isEmptyDir("/sdcard/zhihu"));//返回文件夹path是否为空文件夹。如果该路径并非文件夹,则直接返回false log("目录连接或文件",files.join("/sdcard/", "1.txt")); //连接两个路径并返回 log(files.create("/sdcard/test1111.txt")); //创建一个文件或文件夹并返回是否创建成功。如果文件已经存在,则直接返回false。 log(files.ensureDir("/sdcard/zhihu"));//确保路径path所在的文件夹存在。如果该路径所在文件夹不存在,则创建该文件夹。 files.copy("/sdcard/1.txt", "/sdcard/Download/1.txt");//复制文件,返回是否复制成功 files.move("/sdcard/1.txt", "/sdcard/Download/1.txt");//移动文件,返回是否移动成功。 log(files.getName("/sdcard/1.txt"));//返回文件的文件名(如1.txt),不包含路径 log("返回文件名不含拓展名:",files.getNameWithoutExtension("/sdcard/test.txt"));//返回不含拓展名的文件的文件名 log("返回文件的拓展名:",files.getExtension("/sdcard/test.txt"));//返回文件的拓展名 log(files.remove("/sdcard/3.txt"));//删除文件或空文件夹,返回是否删除成功。 log("返回脚本的当前工作文件夹路径:",files.cwd()); ////删除文件夹,如果文件夹不为空,则删除该文件夹的所有内容再删除该文件夹,返回是否全部删除成功 //log(files.removeDir(path)) //读取文本文件path的所有内容并返回。如果文件不存在,则抛出FileNotFoundException。 log(files.read("/sdcard/test.txt")); log(files.read("/sdcard/test.txt",encoding = "utf-8"));//指定编码,默认为utf-8 //把内容写入文件 var text = "文件444内2222222222555555容111111111111111111111"; files.write("/sdcard/3.txt", text);////写入文件(若文件存在就追加,不存在则创建文件) app.viewFile("/sdcard/3.txt");//用其他应用查看文件
7、其他方法
//================================其他方法===================================== waitForPackage("com.tencent.mm", 1000); //)//等待指定的应用出现,每秒钟检查一次 sleep(1000)//毫秒数 sleep(random(1000,5000)); //随机等待1到5秒 log("message")//打印日志 toast("message")//气泡提示 toastLog("message")//打印日志并气泡提示 console.show()//显示控制台日志 setClip("text")//设置剪贴板内容 exit()//立即停止脚本运行 random(min, max)//随机数
8.授权截图并自动确认
// 创建线程,用于自动点击“允许”按钮 threads.start(function() { sleep(1000); // 等待1秒,确保权限框已经弹出 var allowButton = classNameContains("Button").textContains("允许").findOne(2000); // 查找“允许”按钮 if (allowButton) { allowButton.click(); // 点击“允许”按钮 toast("已自动点击允许"); } else { toast("未找到允许按钮,请手动点击"); } }); // 请求截图权限 if (!requestScreenCapture()) { toast("请求截图失败"); exit(); } // 继续执行脚本 toast("截图权限已开启,继续执行脚本");
9、查询图片并点击图片坐标
"auto"; // 封装请求截图权限并自动点击“允许”按钮的函数 function requestScreenCaptureWithAutoClick() { // 创建线程,用于自动点击“允许”按钮 threads.start(function() { sleep(1000); // 等待1秒,确保权限框已经弹出 var allowButton = classNameContains("Button").textContains("允许").findOne(2000); // 查找“允许”按钮 if (allowButton) { allowButton.click(); // 点击“允许”按钮 log("已自动点击允许"); } else { toast("未找到允许按钮,请手动点击"); } }); // 请求截图权限 if (!requestScreenCapture()) { toast("请求截图失败"); exit(); } // 继续执行脚本 log(">>>>截图权限已开启,继续执行>>>>"); sleep(1000); } // 封装查找图片并点击的函数 function findAndClickImage(imagePath,threshold) { // 加载目标图片 var targetImage = images.read(imagePath); if (!targetImage) { toast("目标图片加载失败,请检查路径"); exit(); } // 截取当前屏幕 var screenshot = captureScreen(); //当阀值没传时、默认取0.8 if (threshold === undefined) { threshold = 0.8; // 默认值 } // 查找目标图片 log("图片阀值:",threshold); var point = images.findImage(screenshot, targetImage, { threshold: threshold // 设置匹配精度,根据实际情况调整 }); if (point) { // 获取目标图片的中心坐标 var x = point.x + targetImage.width / 2; var y = point.y + targetImage.height / 2; // 点击目标图片的中心 click(x, y); toast("点击成功,坐标为 (" + x + ", " + y + ")"); } else { toast("未找到目标图片"); } // 释放图片资源 targetImage.recycle(); screenshot.recycle(); } // 主函数 function main() { //// 请求截图权限并自动点击“允许” requestScreenCaptureWithAutoClick(); //// 查找并点击目标图片(图片太小好像不行) findAndClickImage("/sdcard/Pictures/Screenshots/test005.jpg",0.7); } // 执行主函数 main();
10、图片查询坐标&判断当前页包含xx图片&小案例
"auto"; // 封装请求截图权限并自动点击“允许”按钮的函数 function requestScreenCaptureWithAutoClick() { // 创建线程,用于自动点击“允许”按钮 threads.start(function() { sleep(1000); // 等待1秒,确保权限框已经弹出 var allowButton = classNameContains("Button").textContains("允许").findOne(2000); // 查找“允许”按钮 if (allowButton) { allowButton.click(); // 点击“允许”按钮 log("已自动点击允许"); } else { toast("未找到允许按钮,请手动点击"); } }); // 请求截图权限 if (!requestScreenCapture()) { toast("请求截图失败"); exit(); } // // 继续执行脚本 // log(">>>>截图权限已开启,继续执行>>>>"); // sleep(1000); } // 封装查找图片并点击的函数 function findAndClickImage(imagePath,threshold) { sleep(1000); // 加载目标图片 var targetImage = images.read(imagePath); if (!targetImage) { toast("目标图片加载失败,请检查路径"); exit(); } // 截取当前屏幕 var screenshot = captureScreen(); //当阀值没传时、默认取0.8 if (threshold === undefined) { threshold = 0.8; // 默认值 } // 查找目标图片 log("图片阀值:",threshold); var point = images.findImage(screenshot, targetImage, { threshold: threshold // 设置匹配精度,根据实际情况调整 }); if (point) { // 获取目标图片的中心坐标 var x = point.x + targetImage.width / 2; var y = point.y + targetImage.height / 2; // 点击目标图片的中心 click(x, y); toast("点击成功,坐标为 (" + x + ", " + y + ")"); } else { toast("未找到目标图片"); } // 释放图片资源 targetImage.recycle(); screenshot.recycle(); } // 封装查询图片并返回结果 function findImageOnScreen(imagePath, threshold) { sleep(1000); // 加载目标图片 var targetImage = images.read(imagePath); if (!targetImage) { toast("目标图片加载失败,请检查路径"); // return false; // 返回 false 表示未找到图片 } // 截取当前屏幕 var screenshot = captureScreen(); //当阀值没传时、默认取0.8 if (threshold === undefined) { threshold = 0.8; // 默认值 } // 查找目标图片 log("图片阀值:",threshold); var point = images.findImage(screenshot, targetImage, { threshold: threshold // 设置匹配精度,根据实际情况调整 }); // 释放图片资源 targetImage.recycle(); screenshot.recycle(); // 判断是否找到图片 if (point) { log("找到目标图片"); // 释放图片资源 return true; // 返回 true 表示找到图片 } else { log("未找到目标图片"); return false; // 返回 false 表示未找到图片 } } // 常规函数(业务函数) function regularContent() { toastLog('>>>>>>程序开始执行>>>>>'); //toast提示+log记录 launch("com.tencent.mm"); sleep(2000); //选择主微信 click(360,1920); sleep(2000); findAndClickImage("/sdcard/Pictures/Screenshots/test005.jpg",0.7); sleep(1000); findAndClickImage("/sdcard/Pictures/Screenshots/test006.jpg",0.7); while(!click("扫一扫")); //判断指定元素 } // 主函数 function main() { //// 请求截图权限并自动点击“允许” requestScreenCaptureWithAutoClick(); //regularContent() //// 查找并点击目标图片(图片太小好像不行) //findAndClickImage("/sdcard/Pictures/Screenshots/test005.jpg",0.6); //// 查找当前页面是否包含xx图片 log(findImageOnScreen("/sdcard/Pictures/Screenshots/test005.jpg",0.6)); } // 执行主函数 main();
11、控件相关
auto(); //__________________________判断控件是否可见_____________________________ function element_click(button){ if (button.isClickable()) { button.click(); console.log('>>>>>>控件可见-点击成功>>>>>'); } else { console.log('>>>>>>控件不可点击>>>>>'); console.log('>>>>>>检查是否被其他控件遮挡>>>>>'); } } //////调用函数(可用id、desc、text等) // var element = desc("搜索").findOne(2000); // element_click(element); //_______________判断控件是否可以点击(可用id、text都行)_______________________ var button = id("3bc").findOne(); if (button.isVisible()) { console.log('>>>>>>控件可见>>>>>'); if (button.isClickable()) { button.click(); console.log('>>>>>>点击成功>>>>>'); } else { console.log('>>>>>>控件不可点击>>>>>'); } } else { console.log('>>>>>>控件不可见>>>>>'); } //______________________________判断控件状态相关___________________________ var btnClose = text("朋友").findOne(3000); // 查找控件,超时时间为 3000 毫秒 if (btnClose) { console.log('元素存在'); // 检查控件是否可见 if (btnClose.isVisible()) { console.log("按钮对用户可见"); // 检查控件是否启用 if (btnClose.isEnabled()) { console.log("按钮启用"); // 检查控件是否可点击 if (btnClose.isClickable()) { console.log("按钮可以被点击"); btnClose.click(); // 执行点击操作 } else { console.log("按钮不可点击"); } } else { console.log("按钮未启用"); } } else { console.log("按钮不可见"); // 尝试滚动到控件位置 if (btnClose.scrollIntoView()) { console.log("滚动到按钮位置成功"); // 再次检查是否可见 if (btnClose.isVisible()) { console.log("按钮现在可见"); // 再次检查是否启用和可点击 if (btnClose.isEnabled() && btnClose.isClickable()) { console.log("按钮启用且可以被点击"); btnClose.click(); // 执行点击操作 } else { console.log("按钮不可点击或未启用"); } } else { console.log("按钮仍然不可见"); } } else { console.log("无法滚动到按钮位置"); } } } else { console.log('元素不存在'); } //_____________________处理click()控件点击没反应________________________ function clickUiBounds(ui) { if (ui.exists()) { // 检查控件是否存在 console.log('>>>>>>控件存在>>>>>'); var a = ui.findOnce(); // 尝试获取控件实例 if (a) { console.log('>>>>>>成功获取到控件实例>>>>>'); var b = a.bounds(); // 获取控件的边界信息 if (b) { console.log('>>>>>>控件边界信息有效-点击成功>>>>>'); click(b.centerX(), b.centerY()); // 点击控件的中心位置 return true; // 返回成功标志 } } } return false; // 如果任何一步失败,返回失败标志 } //////调用方式1(支持id、text、desc等) var button = text("朋友"); clickUiBounds(button); ////调用方式2(支持id、text、desc等) clickUiBounds(id("0qd")); //________________处理click()控件点击没反应的方法2________________________ function click_tap(item){ ////计算控件中心坐标、然后通过坐标点击 click(item.bounds().centerX(),item.bounds().centerY()) } //////调用方式(支持id、text、desc、textContains等) var element = text("朋友").findOne(2000); click_tap(element); //_________________________在规定时间内找到元素__________________________ var btnClose = text("朋友").findOne(3000);//findOne(5)查找xx毫秒超时 if (btnClose){ console.log('元素存在'); click(btnClose.bounds().centerX(),btnClose.bounds().centerY());//计算控件中心坐标、然后通过坐标点击 //btnClose.click();//使用控件对象点击 } else{ console.log('元素不存在'); } //________________在规定时间内找到元素(把findOne封装到函数内)______________ function click_tap(selector, timeout = 2000) { // 使用 selector 查找控件 var element = selector.findOne(timeout); if (element) { // 计算控件中心坐标、然后通过坐标点击 click(element.bounds().centerX(), element.bounds().centerY()); console.log("点击成功"); } else { console.log("未找到匹配的控件"); } } // 调用方式(支持 id、text、desc、textContains 等) click_tap(text("朋友"), 2000);
相关链接:
https://blog.csdn.net/gengzeqing/article/details/130409432 ............................auto.js属性以及方法
https://blog.csdn.net/zz00008888/article/details/133642191 ...........................APP自动化工具介绍
https://blog.csdn.net/sixpp/article/details/147662021.......................................Auto.js变成基础知识
http://www.feiyunjs.com/2456.html...................................................................Auto.js和EasyClick
浙公网安备 33010602011771号