1.Auto.js是一款安卓应用,针对安卓7.0以上机型,它可以无需root执行脚本。主要是运用系统自带的“无障碍服务”来获取页面的,这是个亮点,但有个缺陷就是每次关闭 Auto.js 这个app后都要重新开启“无障碍服务”,颇为繁琐。
2.Auto.js可以打包成apk直接装到手机
3.Auto.js可以查看页面布局,需要打开悬浮窗权限
1.快手刷金币
//判断当前页面是否有指定textif (text("发现").exists() || text("同城").exists()){ log('在设置页面—记录log')//可在手机的log中打印 sleep(500); swipe(500,1800,500,300,200);//上滑屏幕 }else{ toast('不在刷视频页面_刷不到金币'); }
2.华为辅助安装处理&oppo手机安装处理
////____________________________华为手机安装处理_______________________________auto();var i=0if(text("继续安装").exists()){ log('111111111111111') sleep(2000) click(760,1650);//坐标点击 sleep(6000) if (text("去华为应用市场查找").exists()){ sleep(2000) click(530,1567);//坐标点击 sleep(4000) } if(text("安装成功").exists()){ toast('安装成功'); click(788,1730);//坐标点击 } }else{ log('没有应用安装弹框'); }////_____________________________oppo手机安装处理_______________________________auto();if(text("继续安装").exists()){ log('111111111111111'); setText("123456"); textContains("确定").find().click(); sleep(5000); if (text("安装").exists()){ sleep(2000) textContains("安装").find().click(); sleep(4000) textContains("完成").find().click(); } }else{ console.error('没有应用安装弹框_安装出错'); }
3.元素判断&js循环语法
(text("忘记"'在设置页面—记录log') toast('显示弹框' btnClose = className("android.widget.TextView").text("小红绳").findOne(500);'1111111111111111111111'(desc("连信"'显示弹框''没有连信' (!textEndsWith("小红"'显示弹框' (textStartsWith("同意").findOne(3000 toastLog('匹配成功'2000'没有找到'(desc("连信"'显示弹框'"连信"3000'没有连信' (("".equals(str)) || ("" ret = str.indexOf(sub_str, =judge_include_str('chenwei', 'chenwei' (text("帐号登录").findOne(5000'找到元素—记录log') toast('显示弹框''没有找到元素' fas = "" fsfan = id("phone_number_edit"( i = 0; i < fsfan.length; i++ ftxt =(ftxt != ""'符合条件'(fas == ""== fas +"_-_"+( i=1;i<4;i++3000'toast弹框信息' num = 1; (num<=10){ document.write(num+"<br />"); num++;( i = 1; i < 10; i++(i == 4}
4.app应用名和包名
// 使用 应用名称,获取应用的包名. var PackageName; //声明变量 PackageName=getPackageName("QQ"); log(PackageName);//使用 包名,获取 应用名称. var AppName; AppName = getAppName("com.tencent.mobileqq"); log(AppName);
5.设备截图
threads.start( (beginBtn = classNameContains("Button").textContains("立即开始").findOne(2000 (!"请求截图失败" sleep(1700); captureScreen("/sdcard/img.png" (!"请求截图失败"captureScreen("/sdcard/img.png"requestScreenCapture(); im = captureScreen(); path = "/sdcard/screenshot.png""保存图片"); Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, android.net.Uri.fromFile(
6.获取设备信息&设备操作
////______________________设备获取&设备操作_______________________________________________////设置无障碍模式 fast为启用缓存auto(); a = device.height; //高度b = device.width; //宽度console.log('设备分辨率:'+b+'*'+a); brand = device.brand; //品牌厂商console.log(brand); model = device.model; // 设备型号console.log(model); product = device.product; // 手机型号名称console.log(product);//硬件序列号serial = device.serial; // c3ba6d87a0d71433console.log(serial);//安卓系统API版本sdkint = device.sdkInt; //API版本:25console.log('API'+sdkint);//系统版本号release = device.release; //7.1.2console.log(release);//安卓idgetandroidid = device.getAndroidId(); //71433c3ba6d87a0dconsole.log(getandroidid);//MAC地址 需要联网才能获取getmacaddress = device.getMacAddress(); //B0:FC:36:12:C9:EFconsole.log(getmacaddress);//获取媒体音量getmusicvolume = device.getMusicVolume(); console.log('音量'+getmusicvolume); //音量:大小//获取电量百分比getbattery = device.getBattery(); //87console.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//唤醒设备 (如果息屏可以点亮屏幕,亮屏就依然亮屏)device.wakeUp();//保持点亮屏幕(设置时间)device.keepScreenOn(30000); //不加参数常亮, 手机亮屏时间以device.keepScreenOn为准,之前系统设置的时间作废//保持屏幕常亮 可调节省电模式device.keepScreenDim(timeout);//取消设备保持唤醒状态 用来取消屏幕的唤醒状态device.cancelKeepingAwake();////使设备震动一段时间device.vibrate(300); //单位毫秒//取消震动device.cancelVibration();
7.模拟按键
////______________________按键模拟_物理按键的全局函数_______________________________________________////设置无障碍模式 fast为启用缓存auto();//以上函数都可以放在toast()或log()里, 例如:toast(notifications());back();//返回,返回是否执行成功home();//回到桌面,返回是否执行成功powerDialog();//弹出电源键菜单。返回是否执行成功notifications();//拉出通知栏。返回是否执行成功quickSettings()//下拉通知栏到底。返回是否执行成功recents();//显示最近任务。返回是否执行成功
8.多线程
////__________________________________多线程_____________________________________//定义子线程var thread = threads.start(function(){ while(true){ sleep(200); log("子线程"); } });//这里是主线程sleep(2000); log('准备停止主线程了')if (20>10){ sleep(1000); //停止线程执行 thread.interrupt(); }////_________________________子线程主动退出____________________________________________var thread = threads.start(function(){ var i=0 while(i<10){ sleep(200); log("子线程"); if (i>5){ log("子线程i>5"); threads.shutDownAll() } i=i+1 } });//这里是主线程sleep(2000); log('准备停止主线程了')if (20>10){ sleep(1000); log('主线程.....') } log('主线程...end')////______________________________堵塞主线程、等待子线程完成____________________________________var sum = 0;//启动子线程计算1加到10000var thread = threads.start(function(){ log('子线程开始') for(var i = 0; i < 10000; i++){ sum += i; } }); log('主线程开始')//等待子线程完成(堵塞)thread.join(); toast("sum = " + sum);
9.获取包名
//_____________________________shell封装_获取手机包名、并转成list___________________________________auto();function get_package() { log('开始启动了'); var result = shell("pm list package -3"); //log(result);//原始第三方包 var str = JSON.stringify(result);//数据类型转换 var str1 = str.match(/package:(\S*)package/)[1];//正则匹配 str_chen = str1.replace(/\\n/g, ",");//替换\n为逗号 basic = str_chen.substr(0, str_chen.length - 1); //删除字符串最后一位 str_page = basic.replace(/package:/g, "");//替换\n为逗号 var page_list = str_page.split(',');//字符串转list(以逗号分割) log(page_list); }// get_package()//________________________shell常用操作(可以封装成函数)_____________________________________________________________//获取包名var result = shell("pm list package -3"); console.log('第三方包名:'+result);//获取品牌var brand = shell("getprop ro.product.brand"); console.log('查看手机品牌:'+brand);//清空应用数据var data_clean = shell("pm clear 包名"); console.log('清空应用数据:'+data_clean);//删除文件var chen=shell("rm -rf ./sdcard/.dalan"); log(chen)//文件复制粘贴var chen=shell("cp /sdcard/2.png /sdcard/test/2.png");//停止appshell('am force-stop ' +包名 , true);////_____________________________js补充知识__________________________________________________//获取字符串1与字符串2之间的内容var str = "aaabbbcccdddeeefff"; log(typeof (str));//获取数据类型str = str.match(/aaa(\S*)fff/)[1]; log(str)//join()数组转字符串let chen = ['ch', '22', 'wei']; text = chen.join(','); log('转换后的字符串:', text);//split()字符串转数组let wei = 'chen,keke,233,你好'; text = wei.split(','); log('转换后的list:', text);//replace()字符串替换var chen = 'dalan_test123_is_notdalan123'str_page = chen.replace(/dalan/g, "word");//替换\n为逗号console.log(str_page)
10.定时器
////___________________每5秒钟执行一次,执行1分钟_______________________//每5秒就发出一次hello var id = setInterval(function(){ log("hello"); }, 5000);//1分钟后取消循环 setTimeout(function(){ clearInterval(id); }, 60 * 1000);////______________________5秒后执行一次___________________________setTimeout(function(){ toast("hello") }, 5000);
11.图片相似度
////_________________________________查找图片红色部分并显示坐标____________________________________path = "/sdcard/1.png"var img = images.read(path); log("读取图片")//循环找色,找到红色时停止并报告坐标while (true) { var point = findColor(img, "#1b8374", { threshold: 120 }); if (point) { toastLog("找到红色#fd1111,坐标为(" + point.x + ", " + point.y + ")"); break } } exit()////______________________________________判断判断图片相似度___________________________________________////先读取文件 var img1 = images.read("/sdcard/1.png");//大图var img2 = images.read("/sdcard/2.png");//小图 // 语法糖 findImage(img, template, options) // template 要找的图片 // options 对象 {threshold ,region, level} // threshold: 0.9, 默认0.9 范围(1-9) 相似度 // region: [x, y] 找图的区域 // 图片比对var result = findImage(img1, img2,{region: [0, 10], threshold: 0.8 }); // 找到返回true, 失败返回falseif(result){ toast("找到啦:" + result); }else{ toast("没找到"); }////______________________________________判断图片相似度(可以两张一样的图片)_____________________________________//大图let max = images.read("/sdcard/1.png"); //小图let min = images.read("/sdcard/2.png");//对比相似对(threshold是阈值)let p = findImage(max, min,{threshold:0.85 });//// 找到返回true, 失败返回falseif (p) { log("找到啦:" + "每日空投"); let xx = random(p.x, p.x + min.getWidth());//小图的x坐标 let yy = random(p.y, p.y + min.getWidth());//小图的y坐标 click(xx, yy) log("点击按钮-每日空投"); sleep(1000) } else { log("没找到" + "每日空投"); }
12.下载文件
log('开始请求接口');var url="http://106.55.29.87:8000/download?filename=d91f77f99ba796397c7df4f5b97726fb.png&path=upload";var res = http.get(url);//判断状态码if(res.statusCode >= 200 && res.statusCode < 300){ toast("页面获取成功!"); //获取文件并保存 files.writeBytes('/sdcard/3.png',res.body.bytes()); //打开文件 app.viewFile('/sdcard/3.png'); log('下载成功') }else if(res.statusCode == 404){ toast("页面没找到哦..."); }else{ toast("未知错误"); }
13.元素定位
123text("18520103625").find();desc("xxxx").find();id("xxxx").find();className("xxxx").find();"属性值").findOne().parent().click(); text("属性值").findOne().childCount(); text("进入游戏").find().click(); text("进入游戏").findOne(3000).click(); "手机").find().click(); textStartsWith("手机").find().click(); textEndsWith("手机").find().click(); text("xxxx").find(); desc("xxxx").find(); id("xxxx").find(); className("xxxx").find(); atextMatches("\\d+"); (text("xx"'在设置页面—记录log') toast('显示弹框' fas = "" fsfan = id("phone_number_edit"( i = 0; i < fsfan.length; i++ ftxt =(ftxt != ""'符合条件'(fas == ""='当前控件元素为:'= fas +"_-_"+ (text(test).findOne(2000'找到了'+ log('点击了'+'没找到'+'登录' str = "18520103625" x = text(str).findOne().bounds().left; y = text(str).findOne().bounds().top;console.log(x,y);
1.通过函数模式操作
//____________________________通过函数打开url&搜索&断言__________________________________________home();//回到桌面sleep(2000);//等待2秒auto(); test_url();//函数声明function test_url(){ var url="https://www.baidu.com/"; app.openUrl(url);//打开网页 sleep(5000); if(text("百度一下").exists()){ log("已在百度首页"); id("su").find();//定位到搜索框 sleep(1000); setText("城南花已开");//输入文字 sleep(1000); desc("百度一下").click(); sleep(4000); //匹配当前页面是否存在“城南花已开 - 百度百科,,可借助auto.js的布局范围分析查看控件” if((className("android.widget.Button").desc("城南花已开 - 百度百科")).exists()){ toastLog('true-已匹配到相关内容') } else{ toastLog('false-未匹配到相关内容') } } }//_____________________通过函数判断是否包含"备忘录"或蓝牙_________________________main();//声明主函数function chen_test(){ //判断当前页面是否有备忘录或蓝牙 if (text("备忘录").exists() || text("蓝牙").exists()) { toast("找到相关内容"); //toast提示 log('在auto.js的日志中打印信息')//可在手机的log中打印 sleep(4000);//等待时间 toast('欢迎进入-设置页面');//toast提示 } else { toast("当前没有找到_任何相关内容"); //悬浮框,toast提示 } }//定义主函数main,需要在顶部先声明不然调用不生效function main(){ chen_test();//调用函数 exit();//退出,可写或不写}
2.监听toast&包名&网络请求&文件上传
////__________________________监听toast和包名(可监听手机一切toast、通知等信息很强大)___________________________________________auto(); events.observeToast(); events.onToast(function(toast){ // log(toast.texts) log("Toast内容:" + toast.getText() +'\n'+"包名:" + toast.getPackageName()) });////_________________________通过包名、应用名启动应用_____________________________________////如果对应的应用不存在,则返回false; 否则返回truevar packageName="com.tencent.mobileqq";var appname="备忘录";////通过包名判断if(app.launch(packageName)){ sleep(2000); log('找到包名:'+packageName); }////通过应用名判断else if (app.launchApp(appname)) { sleep(2000); log('找到应用名:'+appname) }else{ log('没有找到应用') }////_________________________通过应用名获取包名——————————————————————————————————————————var name_pa = getPackageName("备忘录"); //获取应用对应的包名log(name_pa)////__________________________打开一个网址 并判断是否成功__________________________________home();//回到桌面sleep(2000);//等待2秒auto(); test_url();//函数声明function test_url(){ var url="https://www.baidu.com/"; app.openUrl(url);//打开网页 sleep(3000); if(text("百度一下").exists()){ log("断言成功") } }////___________________请求GET__________________________________________________________var url="http://192.168.10.32:8000/subcontract"var res = http.get(url);//判断状态码if(res.statusCode >= 200 && res.statusCode < 300){ toast("页面获取成功!"); }else if(res.statusCode == 404){ toast("页面没找到哦..."); }else{ toast("错误: " + res.statusCode + " " + res.statusMessage); } log('获取头信息:\n',res.headers);// log('获取响应的内容:\n',res.body.string());//以字符串形式返回响应内容// log('获取响应的内容:\n',res.body.json());//以json形式返回响应内容// log('获取响应的内容:\n',res.body.bytes());//以字节数组形式返回响应内容log('当前请求地址及方式\n',res.request) log('当前请求url\n',res.url) log('当前请求的方法\n',res.method) log('响应状态码:',res.statusCode) log('响应的HTTP状态信息:',res.statusMessage)////带headers的get请求var url = "http://192.168.10.32:8000/subcontract";var res = http.get(url,{ headers: { 'Accept-Language': 'zh-cn,zh;q=0.5', 'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11' } });if(res.statusCode >= 200 && res.statusCode < 300){ toast("页面获取成功!"); }else if(res.statusCode == 404){ toast("页面没找到哦..."); }else{ toast("错误: " + res.statusCode + " " + res.statusMessage); }////获取返回信息var html = res.body.string(); log(html)////_____________________请求post________________________________________________________////post请求方式一:var url = "http://192.168.10.32:8000/subcontract";var res = http.post(url,{"game_id":"200003306","name":"dalan_test"});//获取返回信息var html = res.body.string(); log(html)//通过状态码判断if(res.statusCode >= 200 && res.statusCode < 300){ toast("页面获取成功!"); }else if(res.statusCode == 404){ toast("页面没找到哦..."); }else{ toast("错误: " + res.statusCode + " " + res.statusMessage); }//通过字符串匹配来判断(&&表示且,||表示或)if(html.match('status') && html.match('POST')){ log('已经包含') }else{ log('没有包含') }////post请求二://例如接口响应为:{ code: 200, method: 'POST', msg: '渠道包上传成功!', status: true }let url = "http://192.168.10.32:8000/subcontract"; let res = http.post(url, { "service": "App.Zllgcimei.Imei", "game_id": "200003306"}); let appName;//声明变量let html = res.body.string(); //取页面html源码log(html)//JSON.parse() 将数据转换为 JavaScript 对象。let json = JSON.parse(html);//log(json)if (json.code == "200") { log("符合条件") appName = json.msg } else { log("请求失败!") } log(appName)//postJson方式(相当于post的json请求)let url = "http://192.168.10.32:8000/subcontract"; r = http.postJson(url, { "service": "App.Zllgcimei.Imei", "game_id": "200003306"}); let text=r.body.string();//获取响应//同时弹起toast和记录日志toastLog(text);////____________________文件上传__________________________________________________var url="http://106.55.29.87:8000/upload"var res = http.postMultipart(url, { file: open("/sdcard/test/chen.jpg") }); let html=res.body.string();//打印原始数据let json = JSON.parse(html);//将数据转换为 JavaScript 对象。log(json)if (json.msg == "success") { log('上传文件成功') }
3.autojs模块调用:
放到同一个目录下运行,必须是手机上的目录,不能pc F5,因为require的文件在pc上没有在手机上。
main.js模块为主调用方:
log("开始测试");//导入模块var common= require('common.js');//调用函数log("两数相乘%d", common.chen()); console.log("%d+%d=%d", 3,4,common.chen_age(3,4));//console.log或log功能都一样log(common.chen_sum(5));
common.js模块为被方:
common=common.chen = =50 pp * 10common.chen_age= (a+b)/2;common.chen_sum= a = arguments[0] ? arguments[0] : 200 b = arguments[1] ? arguments[1] : 150 a+ module.exports = common;
4.判断手机横竖屏
////_________________________判断手机横竖屏_______________________________chen();// 函数在function后,可以在前面或后面调用function chen() { var a = (context.resources.configuration.orientation); if (a === 1) { toastLog("这是竖屏!!"); return '竖屏' } else { toastLog("这是横屏!!");} return '横屏'}// chen();// 函数在function前, 只能在后面调用chen=function() { var a = (context.resources.configuration.orientation); if (a === 1) { toastLog("这是竖屏!!"); return '竖屏' } else { toastLog("这是横屏!!");} return '横屏'} chen();
5.页面相关
"ui";////__________________________________________点击页面中点击确定触发动作———————————————————————————ui.layout( <vertical padding="16"> <text textSize="16sp" textColor="black" text="请输入执行函数"/> <input id="name" text=""/> <button id="ok" text="确定"/> </vertical>);////指定确定按钮点击时要执行的动作ui.ok.click(function(){ //通过getText()获取输入的内容 var name = ui.name.getText(); toast(name + "您好!"); eval(name+'()');//通过变量调用函数 });////定义函数function test(){ var url="https://www.baidu.com/"; console.log('网址:'+url); }////_____________________________________________布局________________________________________________////布局一"ui"; ui.layout( <vertical h="100dp" weightSum="5"> <text layout_weight="1" text="控件1" bg="#ff0000"/> <text layout_weight="2" text="控件2" bg="#00ff00"/> <text layout_weight="1" text="控件3" bg="#0000ff"/> </vertical>);////布局二"ui"; ui.layout( <vertical h="100dp"> <text h="40dp" text="控件1" bg="#ff0000"/> <text layout_weight="2" text="控件2" bg="#00ff00"/> <text layout_weight="1" text="控件3" bg="#0000ff"/> </vertical>);////按钮布局"ui"; ui.layout( <horizontal> <button text="第一个按钮"/> <button text="第二个按钮"/> </horizontal>);////页面布局"ui"; ui.layout( <frame> <button gravity="right" w="*" h="auto" text="靠右的文字"/> </frame> );
#包相关 launchApp('名字'); //通过app名字启动app应用launch('app包名'); //通过包名启动app应用app.uninstall('包名'); //卸载appvar name=getPackageName('应用名'); //通过应用名获取app包名console.log(name);var name_1=getAppName("com.tencent.mobileqq"); //通过包名返回应用名console.log(name_1);////获取当前正在运行的应用的包名var Package=currentPackage();//获取当前正在运行的应用的包名,此函数依赖于无障碍服务(未启动会报异常)print(Package);//print、console.log、log都能打印日志console.log(Package);////获取当前正在运行的Activity的名称var Activity=currentActivity()//获取当前正在运行的Activity的名称,此函数依赖于无障碍服务(未启动会报异常)print(Activity)var a=app.openAppSetting('包名');//打开应用的详情页(设置页)。如果找不到该应用返回false; 否则返回true。log(a); #元素定位 text("属性值").findOne().parent().click(); //parent通过子控件查找父控件,常用于子控件不能点击,而通过子控件查找到父控件完成点击text("属性值").findOne().childCount(); //获取控件中子控件的数量text("进入游戏").find().click(); //点击进入游戏(先查找再点击)text("进入游戏").findOne(3000).click(); //点击进入游戏___查询超时就报错,,(text()是完全匹配)textContains("手机").find().click(); //匹配页面包含手机的元素textStartsWith("手机").find().click(); //匹配以"手机"开头的元素textEndsWith("手机").find().click(); //匹配以"手机"结尾的元素text("xxxx").find(); //按控件文本查找,, 也可使用findOne()desc("xxxx").find(); //按描述信息查找id("xxxx").find(); //按元素id查找元素className("xxxx").find(); //按元素类型查找atextMatches("\\d+"); //以正则匹配#等待 sleep(random(1000,5000)); //随机等待1到5秒sleep(2000); //等待2秒#常用功能键 home(); //回到桌面back(); //返回上一步#常用操作 click(x,y); //单点击坐标click('登录'); //点击text的元素press(x,y,time); //按住坐标,time表示时间毫秒swipe(x1,y1,x2,y2,time); //滑动屏幕(time表示滑动的时间)#日志信息相关 toast("hallo word"); //在手机toast提示toastLog('hallo word'); //toast提示+log记录log('hallo word'); //记录logconsole.verbose("要输出的内容");//颜色为灰色(一般用来打印不重要内容)console.info("要输出的内容");//颜色为绿色(一般用来打印运行信息)console.warn("要输出的内容");//颜色为蓝色(一般用来打印运行警报)console.error("要输出的内容");//颜色为红色(一般用来打印运行报错信息)#对话框 alert("标题","内容"); //对话框输出
1.在脚本前面加auto();、auto、auto.waitFor()有什么作用?
auto()
函数来确保无障碍服务已经启用。如果运行到某个需要权限的语句无障碍服务并没启动,则会抛出异常并跳转到无障碍服务界面.
auto.waitFor()检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行
var a=auto.service 获取无障碍服务。如果无障碍服务没有启动,则返回null。
2.autojs怎么运行?
1.在手机上装了auto.js可以直接写代码运行,2.可以VS Code来编写脚本运行到手机(需要手机安装了autojs)
3.Visual Studio Code可以连接模拟器吗?
可以连接模拟器(vs code终端输入 adb connect 127.0.0.1:5037)
4.重启了VS Code为什么autojs连不上?
重启后VS Code后 Auto.js: Start Server服务不会自动开启,需要手动启动
5.如何连接手机?
1.开启AutoJS插件
按 Ctrl+Shift+P 或点击"查看"->"命令面板"可调出命令面板,输入 Auto.js 可以看到几个命令,移动光标到命令Auto.js: Start Server,按回车键执行该命令。
2.连接手机终端
将手机连接到电脑启用的Wifi或者同一局域网中。通过命令行ipconfig(或者其他操作系统的相同功能命令)查看电脑的IP地址。在Auto.js的侧拉菜单中启用调试服务,并输入IP地址,等待连接成功。
6.定时器或定时任务无法在手机黑屏操作(待确定)?
可以在脚本前加个 device.wakeUp();就会自动点亮屏(1.黑屏非锁屏状态(休眠),2.usb连接电脑或插座充电)
7.遍历所有子节点
// js递归遍历数组获取所有的叶子节点 let arr = []; function queryList(json, arr) { for (var i = 0; i < json.childCount(); i++) { let sonList = json.child(i); if (sonList.childCount() == 0) { arr.push(json.child(i)); } else { queryList(sonList, arr); } } return arr; } let nodes = []; let list = id("content").findOne(); arr = queryList(list, arr); for (var k = 0; k < arr.length; k++) { // log("第"+k+"个子控件"); // log("text="+arr[k].text()+"\n" +"ID="+arr[k].id()+"\n"+"classname="+arr[k].className()); // log("desc="+arr[k].desc()+"\n"); nodes[k] = { "text": arr[k].text(), "id": arr[k].id(), "classname": arr[k].className(), "desc": arr[k].desc(), "bounds": arr[k].bounds(), "centerX": arr[k].bounds().centerX(), "centerY": arr[k].bounds().centerY(), }; } log(JSON.stringify(nodes))
https://blog.csdn.net/QiHsMing/article/details/86762007 ..........................在VS Code运行AutoJS(包含电脑端调试到手机,,页面布局)
https://blog.csdn.net/ss7379829/article/details/80819374 ........................VS Code中怎么运行js文件
https://pro.autojs.org/docs/#/zh-cn/ ..........................................................autojs官方教程
https://gitee.com/jianyue/autojsDemo?skip_mobile=true ..........................gitee的autojs案例
https://blog.csdn.net/zy0412326/article/details/117155945 ...............autojs打包成apk
https://blog.csdn.net/camel2014/article/details/104928199 .....................autojs模块调用(放到同一个目录下运行,必须是手机上的目录,不能pc F5,因为require的文件在pc上没有在手机上)
https://blog.csdn.net/yinmingxuan/article/details/90266388 ......................autojs实例教程
https://space.bilibili.com/26079586 ...........................................................autojs视频
无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。