Autojs简单案例&常用控件汇总 您所在的位置:网站首页 autojs判断控件存在返回true Autojs简单案例&常用控件汇总

Autojs简单案例&常用控件汇总

2023-11-12 22:23| 来源: 网络整理| 查看: 265

一、介绍:

1.Auto.js是一款安卓应用,针对安卓7.0以上机型,它可以无需root执行脚本。主要是运用系统自带的“无障碍服务”来获取页面的,这是个亮点,但有个缺陷就是每次关闭 Auto.js 这个app后都要重新开启“无障碍服务”,颇为繁琐。

2.Auto.js可以打包成apk直接装到手机

3.Auto.js可以查看页面布局,需要打开悬浮窗权限

备注:部分功能需要pro版才能用

 

 

二、简单案例:

1.快手刷金币

auto(); //确保无障碍服务已经启用 //判断当前页面是否有指定text if (text("发现").exists() || text("同城").exists()){ log('在设置页面—记录log')//可在手机的log中打印 sleep(500); swipe(500,1800,500,300,200);//上滑屏幕 } else{ toast('不在刷视频页面_刷不到金币'); }

 

2.华为辅助安装处理&oppo手机安装处理

////____________________________华为手机安装处理_______________________________ auto();//确保无障碍服务已经启用 var i=0 if(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循环语法

/////================================================================判断页面元素=================================================================== ////------------------查询方式一(需求完全匹配)----------------------------------------- if (text("忘记").exists()){ log('在设置页面—记录log')//可在手机的log中打印 toast('显示弹框'); } //--------------------查询方式二-------------------------------------- var btnClose = className("android.widget.TextView").text("小红绳").findOne(500);//findOne(500)查找500毫秒超时 if (btnClose){ toast('1111111111111111111111'); } ////--------------------查询方式三-------------------------------------- if(desc("连信").exists()){ toast('显示弹框'); } else{ toast('没有连信'); } //---------------当前页面不包含'小红',执行循环体-------------------------- if (!textEndsWith("小红").exists()){ toast('显示弹框'); } ////-----------------------------正则匹配-------------------------------- //匹配以‘同意’开头的字符串,若3秒内没有查询到则失败。 if (textStartsWith("同意").findOne(3000)){ // 匹配以手机结尾的元素textEndsWith("手机") //匹配页面包含手机的元素textContains("手机") toastLog('匹配成功'); sleep(2000) } else{ toastLog('没有找到'); } ////-----------判断当前页面是否包含连信,有就启动--------------------------- if(desc("连信").exists()){ toast('显示弹框'); app.launchApp("连信"); sleep(3000); } else{ toast('没有连信'); } ////_______________________________________两个字符串比较______________________________ function judge_include_str(str, sub_str) { //判断两个字符串是否相等,相等为0,不相等为-1 if (("".equals(str)) || ("".equals(sub_str))) { return true; } else { var ret = str.indexOf(sub_str, false) return ret; } } aa=judge_include_str('chenwei', 'chenwei'); log(aa); ////_______________________在指定时间内查询元素,超时就失败_______________________________________ if (text("帐号登录").findOne(5000)){ log('找到元素—记录log')//可在手机的log中打印 toast('显示弹框'); } else{ log('没有找到元素') } ////_______________________________________获取元素的内容________________________________ function screen_content(){ var fas = ""; //按元素id查找,,可以为className、desc等 var fsfan = id("phone_number_edit").find(); for(var i = 0; i < fsfan.length; i++){ var ftxt = fsfan[i].text(); if(ftxt != ""){ toast('符合条件'); if(fas == ""){ fas = ftxt; console.log(fas) }else{ fas = fas +"_-_"+ ftxt; console.log(fas) } } } } screen_content(); /////======================================================循环============================================================================= ////-----------------------------------------for循环---------------------------------------- for(var i=1;i10){ sleep(1000); //停止线程执行 thread.interrupt(); } ////_________________________子线程主动退出____________________________________________ var thread = threads.start(function(){ var i=0 while(i5){ log("子线程i>5"); threads.shutDownAll() } i=i+1 } }); //这里是主线程 sleep(2000); log('准备停止主线程了') if (20>10){ sleep(1000); log('主线程.....') } log('主线程...end') ////______________________________堵塞主线程、等待子线程完成____________________________________ var sum = 0; //启动子线程计算1加到10000 var thread = threads.start(function(){ log('子线程开始') for(var i = 0; i < 10000; i++){ sum += i; } }); log('主线程开始') //等待子线程完成(堵塞) thread.join(); toast("sum = " + sum); //_______________________________线程定时任务执行____________________________________ threads.start(function(){ setInterval(function(){ log("定时循环函数,2000表示毫秒"); }, 2000); }); //________________________________线程通讯________________________________________ /** * 线程你们的数据是不能直接在线程以外直接调用,而业务逻辑需要调用线程的业务数据 * 需要用到线程通讯 */ var sum = threads.disposable();//声明一个变量来接受 线程通讯返回的数据 //用线程实现1到100累加 threads.start(function(){ var s = 0; //用for循环做1-100的阶加 for(var i = 1; i = 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.元素定位

///////==========================================================元素定位=================================================================== 说明: 1.findOne()根据选择器selector在该控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回找到的第一个控件;如果没有找到符合条件的控件则返回null。 2.find()根据选择器selector在该控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回它们组合的集合。 3.parent()返回该控件的父控件。如果该控件没有父控件,返回null。 //------------------------用auto.js查找界面元素----------------------------- text("18520103625").find();//按控件文本查找,,也可使用findOne() desc("xxxx").find();//按描述信息查找 id("xxxx").find();//按元素id查找 className("xxxx").find();//按元素类型查找 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+"); //以正则匹配 //________________判断当前是否包含xx元素__________________________ if (text("xx").exists()){ log('在设置页面—记录log')//可在手机的log中打印 toast('显示弹框'); } //_______________________________________获取元素的内容________________________________ function screen_content(){ var fas = ""; //按元素id查找,,可以为className、desc等 var fsfan = id("phone_number_edit").find(); for(var i = 0; i < fsfan.length; i++){ var ftxt = fsfan[i].text(); if(ftxt != ""){ toast('符合条件'); if(fas == ""){ fas = ftxt; console.log('当前控件元素为:',fas) }else{ fas = fas +"_-_"+ ftxt; console.log(fas) } } } } screen_content(); ////___________________________函数封装定位元素、点击_______________________________________ function clickText(test){ //2秒内找到元素,超时失败 if(text(test).findOne(2000)){ log('找到了'+test); click(test);//点击元素 log('点击了'+test); }else{ log('没找到'+test); } } clickText('登录') ////_____________________________获取文本的坐标位置__________________________________________ var str = "18520103625"; var x = text(str).findOne().bounds().left;// 首次出现的x坐标 var y = text(str).findOne().bounds().top;// 首次出现的y坐标 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; 否则返回true var 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,必须的 var common= {}; //定义函数,没有参数 common.chen = function(){ let pp=50; //求乘法 return pp * 10; }; //定义函数,带参数(a,b) common.chen_age=function(a,b){ log(a,b); //求平均数 return (a+b)/2; }; //定义带有默认值的函数 common.chen_sum=function(){ var a = arguments[0] ? arguments[0] : 200; var b = arguments[1] ? arguments[1] : 150; //求和 return a+b; }; ////调用方式 // alert( simue() ); //输出350 // alert( simue(10) ); //输出160 // alert( simue(10,20) ); //输出30 //对象引用,必须的 module.exports = common;

方法二:

//m2.js module.exports={ //变量a a:1, //带两个形参的函数 b:(str1,str2)=>{ return str1+","+str2 } } //main.js var m2=require("m2.js") toast(m2.a) //调用变量a toast(m2.b("hello","world")) //调用函数传两个参数

 

 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( ); ////指定确定按钮点击时要执行的动作 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( ); ////布局二 "ui"; ui.layout( ); ////按钮布局 "ui"; ui.layout( ); ////页面布局 "ui"; ui.layout( );

 

 

四、常用控件汇总 #包相关 launchApp('名字'); //通过app名字启动app应用 launch('app包名'); //通过包名启动app应用 app.uninstall('包名'); //卸载app var 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表示滑动的时间)

  //从(500,800)的位置滑动到(500,300)的位置,再移动到(200,300)的位置,使用1000毫秒(1秒)的时间来完成滑动  gesture(1000,[500,800],[500,300],[200,300]);

  gesture(1000,[500,800],[500,300]); //也可以两组滑动

#日志信息相关 toast("hallo word"); //在手机toast提示 toastLog('hallo word'); //toast提示+log记录 log('hallo word'); //记录log console.verbose("要输出的内容");//颜色为灰色(一般用来打印不重要内容) console.info("要输出的内容");//颜色为绿色(一般用来打印运行信息) console.warn("要输出的内容");//颜色为蓝色(一般用来打印运行警报) console.error("要输出的内容");//颜色为红色(一般用来打印运行报错信息) #对话框 alert("标题","内容"); //对话框输出

 

 

五、疑问解答

1.在脚本前面加auto();、auto、auto.waitFor()有什么作用?

 auto()函数来确保无障碍服务已经启用。如果运行到某个需要权限的语句无障碍服务并没启动,则会抛出异常并跳转到无障碍服务界面.

   auto.waitFor()检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行

   var a=auto.service 获取无障碍服务。如果无障碍服务没有启动,则返回null。

    备注:无障碍服务不能直接通过autojs打开,可以配合adb+设置无障碍快捷方式

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.autojs连接VS Code

    将手机连接到电脑启用的Wifi或者同一局域网中。通过命令行ipconfig(或者其他操作系统的相同功能命令)查看电脑的IP地址。在Auto.js的侧拉菜单中启用调试服务,并输入IP地址,等待连接成功。 

      

 

     3.VS Code这样页面就连接成功了  

      

 

6.定时器或定时任务无法在手机黑屏操作(待确定)?

 可以在脚本前加个 device.wakeUp();就会自动点亮屏(1.黑屏非锁屏状态(休眠),2.usb连接电脑或插座充电)

 

 

相关连接:

https://blog.csdn.net/QiHsMing/article/details/86762007 ..........................在VS Code运行AutoJS(包含电脑端调试到手机,,页面布局)

https://blog.csdn.net/ss7379829/article/details/80819374 ........................VS Code中怎么运行js文件,,autojs pro版本在VS Code使用

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实例教程,,autojs模块调用三种方法

https://space.bilibili.com/26079586 ...........................................................autojs视频,,UI教程

https://blog.csdn.net/qq_17175585/article/details/120279193 ..................线程通讯与线程详解



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有