一、vscode环境配置快速启动、调试
- 【前置条件】:优先开启物障碍模式 左上角功能按钮->无障碍快捷方式->更多下载的服务 【根据不同的app】
-
- 1、vscode 插件: Auto.js-VSCodeExt 安装 (注意插件一定要选对!)
-
- 2、按 Ctrl+Shift+P 或点击"查看"->"命令面板"可调出命令面板,输入 Auto.js 可以看到几个命令,移动光标到命令Auto.js: Start Server,按回车键执行该命令。
-
- 3、启动auto js start server 后vscode 右下角会显示ip :端口
-
- 4、打开手机auto.js 功能页,选择连接电脑,输入上面的ip地址若无,可通过cmd窗口ipconfig获取
-
二、全局方法
- waitForPackage(package[, period = 200])
- waitForPackage("com.tencent.mm")
- waitForActivity(activity[, period = 200])
- waitForActivity("com.ss.android.ugc.aweme.following.ui.FollowRelationTabActivity")
- sleep(n)
- log("message")
- toast("message")
- toastLog("message")
- setClip("text")
- exit()
- random(min, max)
-
三、应用方法
- launch("包名")
- launchPackage("包名")
- launchApp(appName)
- getPackageName(appName)
- getAppName("包名")
- app.openAppSetting("包名")
- app.editFile("/sdcard/1.txt/);
- app.uninstall("com.tencent.mobileqq");
- app.openUrl("包名");
-
四、坐标方法
- setScreenMetrics(width, height)在width*height的设备中,坐标操作自适应
- width {number}
- height {number}
- 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], …)
- gestures([delay1, duration1, [x1, y1], [x2, y2], …], [delay2, duration2, [x3, y3], [x4, y4], …], …)
-
五、控件方法
5.1、 文本控件
- setText([i, ]text)
- input([i, ]text)
- click(text[, i])
- while(!click("扫一扫"));
- longClick(text[, i]))
-
5.2、滑动控件
- scrollUp([i])
- scrollDown([i])
- className("ImageView").depth(10).findOne().click()
-
5.3、选择器控件
- UiSelector.text(str)
- UiSelector.textContains(包含)
- UiSelector.textStartsWith(前缀)
- UiSelector.textEndsWith(后缀)
- UiSelector.textMatches(正则)
- UiSelector.desc(str)
- UiSelector.descContains(前缀)
- UiSelector.descStartsWith(prefix)
- UiSelector.descEndsWith(suffix)
- UiSelector.descMatches(正则)
- UiSelector.id(str)
- UiSelector.idContains(包含)
- UiSelector.idStartsWith(前缀)
- UiSelector.idEndsWith(后缀)
- UiSelector.idMatches(正则)
- UiSelector.className(str)
- UiSelector.classNameContains(包含)包含
- UiSelector.classNameStartsWith(前缀)
- UiSelector.classNameEndsWith(后缀)
- UiSelector.classNameMatches(正则)为正则
- UiSelector.packageName(str)packageName控件str
- UiSelector.packageNameContains(包含)包含
- UiSelector.packageNameStartsWith(前缀)
- UiSelector.packageNameEndsWith(后缀)
- UiSelector.packageNameMatches(正则)
-
- (左边距;上边距;下边距;右边距)
- UiSelector.bounds(left, top, right, buttom)
- UiSelector.boundsInside(left, top, right, buttom)在参数构成的范围里面查找符合条件的控件。用于限制选择器在某一个区域选择控件。
- UiSelector.boundsContains(left, top, right, buttom)在参数构成的范围里面查找符合条件的控件。用于限制控件的范围必须包含所给定的范围。
- UiSelector.drawingOrder(number)
- UiSelector.clickable([b = true])为当前选择器附加控件是否可点击的条件。类名为android.view.View的控件大多可点击
- UiSelector.longClickable([b = true])为当前选择器附加控件是否可长按的条件。
- UiSelector.checkable([b = true])为当前选择器附加控件是否可勾选的条件。
- UiSelector.selected([b = true])为当前选择器附加控件是否已选中的条件。
- UiSelector.enabled([b = true])为当前选择器附加控件是否已启用的条件。
- UiSelector.scrollable([b = true])为当前选择器附加控件是否可滑动的条件。可以用这个条件来寻找可滑动控件来滑动界面。
-
- UiSelector.editable([b = true])为当前选择器附加控件是否可编辑的条件;一般来说可编辑的控件为输入框(EditText)但不是所有
- UiSelector.multiLine([b = true])为当前选择器附加控件是否文本或输入框控件是否是多行显示的条件。
- UiSelector.findOne()对屏幕上的控件进行搜索,找不到控件,当屏幕内容发生变化时会重新寻找,直到屏幕上出现并返回该控件。未出现则阻塞
- UiSelector.findOne(timeout)毫秒的时间内没有找到终止搜索并返回null
- UiSelector.findOnce()对屏幕上的控件进行搜索,只找一次;返回第1个符合条件的控件;否则返回null
- UiSelector.findOnce(i)对屏幕上的控件进行搜索,只找一次;返回第 i + 1 个符合条件的控件;否则返回null
- UiSelector.find()对屏幕上的控件进行搜索,找到所有满足条件的控件集合并返回。只进行一次
- empty()函数判断找到的是否为空
- UiSelector.untilFind()对屏幕上的控件进行搜索,直到找到至少一个满足条件的控件为止,并返回所有满足条件的控件集合。
- UiSelector.exists()判断屏幕上是否存在控件符合选择器所确定的条件;一般搭配if使用
- UiSelector.waitFor()等待屏幕上出现符合条件的控件;在满足该条件的控件出现之前,该函数会一直保持阻塞。
- UiSelector.filter(f)为当前选择器附加自定义的过滤条件。
-
六、UiSelector选择器
6.1、控件属性
- className 类名。类名表示一个控件的类型,例如文本控件为"android.widget.TextView", 图片控件为"android.widget.ImageView"等。
- packageName 包名。包名表示控件所在的应用包名,例如QQ界面的控件的包名为"com.tencent.mobileqq"。
- bounds 控件在屏幕上的范围。
- drawingOrder 控件在父控件的绘制顺序。
- indexInParent 控件在父控件的位置。
- clickable 控件是否可点击。
- longClickable 控件是否可长按。
- checkable 控件是否可勾选。
- checked 控件是否可已勾选。
- scrollable 控件是否可滑动。
- selected 控件是否已选择。
- editable 控件是否可编辑。
- visibleToUser 控件是否可见,可以筛选在屏幕可视范围内的组件。
- enabled 控件是否已启用。
- depth 控件的布局深度。
-
6.2、 控件类型
- android.widget.TextView
- android.widget.ImageView
- android.widget.Button
- android.widget.EditText
- android.widget.AbsListView
- android.widget.LinearLayout
- android.widget.FrameLayout
- android.widget.RelativeLayout
- android.widget.RelativeLayout
- android.support.v7.widget.RecyclerView
-
七、选择器操作
- exits() 判断控件是否存在
- waitFor() 等待控件出现
- UiObject.click()
- UiObject.longClick()
- UiObject.setText(text)
- UiObject.copy()
- UiObject.cut()
- UiObject.paste()
- UiObject.setSelection(start, end)
- UiObject.scrollForward()
- UiObject.scrollBackward()
- UiObject.select()
- UiObject.collapse()
- UiObject.expand()
- UiObject.show()
- UiObject.scrollUp()
- UiObject.scrollDown()
- UiObject.scrollLeft()
- UiObject.scrollRight()
- children()
- childCount()
- parent()
- bounds()
- boundsInParent()
- drawingOrder()
- id()
- text()
- findByText(str)
- findOne(selector)
- find(selector)
- UiCollection
- UiCollection.size()
- UiCollection.get(i)
- UiCollection.each(func)
- empty()
- nonEmpty()
- UiCollection.find(selector)
- UiCollection.findOne(selector)
- 如果没有找到符合条件的控件则返回null。
-
八、按键模拟
- back()返回
- home()Home键
- recents()显示最近任务
- powerDialog()电源键菜单
- notifications()拉出通知栏
- quickSettings()显示快速设置(下拉通知栏到底)
- splitScreen()分屏
-
九、常用功能函数
- sleep(n)暂停运行n毫秒,常见的情况是,软件的运行速度“跟不上”脚本,因此需要一定时间的等待(尤其是需要点击的控件以滑动的方式进入,若不等待可能点击不到)
- toast(message)显示气泡信息
- log(message)在控制台中输出信息
- toastLog(message)上面两个函数的合体
- exit()立即停止脚本运行
-
十、阿里系滑块实战
-
-
- var y = 1305
-
-
- var timeMin= 1500
- var timeMax= 4500
-
-
-
-
-
-
-
- start()
-
- function start() {
- auto.waitFor()
- while(true){
- var slider_page = text('亲,请拖动下方滑块完成验证').findOnce();
- var slider_exists = text('向右滑动验证').findOnce();
-
- if (slider_page != null){
-
-
- if (slider_exists != null){
- log('ex slider!')
- trigger_slider()
- }else{
- log('fail ex slider!')
- trigger_slider()
- }
- }else{
- log('not ex slider!')
- }
- sleep(5000)
-
- }
-
- }
-
- function refresh(){
- if(text('刷新').findOnce()){
- text('刷新').findOne().click();
- }
- }
-
- function trigger_slider(){
- randomSwipe(200, y, 900, y)
- }
-
- function open_slider(){
- launchApp("浏览器");
- app.openUrl("https://ditu.amap.com/detail/get/detail?id=B0014014AD")
- sleep(6000)
- }
-
- function bezierCreate(x1,y1,x2,y2,x3,y3,x4,y4){
-
- var h=100;
- var cp=[{x:x1,y:y1+h},{x:x2,y:y2+h},{x:x3,y:y3+h},{x:x4,y:y4+h}];
- var numberOfPoints = 100;
- var curve = [];
- var dt = 1.0 / (numberOfPoints - 1);
-
-
- for (var i = 0; i < numberOfPoints; i++){
- var ax, bx, cx;
- var ay, by, cy;
- var tSquared, tCubed;
- var result_x, result_y;
-
- cx = 3.0 * (cp[1].x - cp[0].x);
- bx = 3.0 * (cp[2].x - cp[1].x) - cx;
- ax = cp[3].x - cp[0].x - cx - bx;
- cy = 3.0 * (cp[1].y - cp[0].y);
- by = 3.0 * (cp[2].y - cp[1].y) - cy;
- ay = cp[3].y - cp[0].y - cy - by;
-
- var t=dt*i
- tSquared = t * t;
- tCubed = tSquared * t;
- result_x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
- result_y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
- curve[i] = {
- x: result_x,
- y: result_y
- };
-
- }
-
-
- var array=[];
- for (var i = 0;i<curve.length; i++) {
- try {
- var j = (i < 100) ? i : (199 - i);
- xx = parseInt(curve[j].x)
- yy = parseInt(Math.abs(100 - curve[j].y))
- } catch (e) {
- break
- }
- array.push([xx, yy])
- }
- return array
- }
-
-
-
- function randomSwipe(sx,sy,ex,ey){
-
- var leaveHeightLength=500
-
-
- if(Math.abs(ex-sx)>Math.abs(ey-sy)){
- var my=(sy+ey)/2
- var y2=my+random(0,leaveHeightLength)
- var y3=my-random(0,leaveHeightLength)
-
- var lx=(sx-ex)/3
- if(lx<0){lx=-lx}
- var x2=sx+lx/2+random(0,lx)
- var x3=sx+lx+lx/2+random(0,lx)
- }else{
- var mx=(sx+ex)/2
- var y2=mx+random(0,leaveHeightLength)
- var y3=mx-random(0,leaveHeightLength)
-
-
- var ly=(sy-ey)/3
- if(ly<0){ly=-ly}
- var y2=sy+ly/2+random(0,ly)
- var y3=sy+ly+ly/2+random(0,ly)
- }
-
-
-
- var time=[0,random(timeMin,timeMax)]
- var track=bezierCreate(sx,sy,x2,y2,x3,y3,ex,ey)
-
- log("随机控制点A坐标:"+x2+","+y2)
- log("随机控制点B坐标:"+x3+","+y3)
- log("随机滑动时长:"+time[1])
-
-
- gestures(time.concat(track))
-
-
- }
-