Auto.js无障碍免root脚本开发学习

Auto.js

简单入门

官方文档:https://hyb1996.github.io/AutoJs-Docs/#/
https://blog.csdn.net/QiHsMing/article/details/86762007
https://blog.csdn.net/zy0412326/article/details/105140707
获取手机屏幕坐标:https://jingyan.baidu.com/article/00a07f38297bd082d028dce7.html
小米手机开发者选项:https://jingyan.baidu.com/article/d5c4b52bb10b8eda560dc531.html
视频教程:https://www.bilibili.com/video/BV1eb411c7dT
开发工具:vscode ,插件:Auto.js-VSCodeExt (对应免费版)

1、理解 Auto.js 的原理

Auto.js是个基于JavaScript语言运行在Android平台上的脚本框架。Auto.js主要工作原理是基于辅助服务AccessibilityService

2、利用 Auto.js 做几个小应用

  • 微信自动点赞
  • 咪咕阅读打卡

https://github.com/Orange-shirt/OrangeJs

  • 东东农场自动脚本
  • 喵币++_淘宝脚本
  • 多多果园自动脚本_拼多多脚本.
  • 微博任务自动脚本_微博脚本.js
  • 种豆得豆自动脚本_京东脚本.js
  • 自动健康打卡_完美校园脚本.js
  • 自动动态点赞_QQ脚本.js
  • 自动叠蛋糕_京东脚本.js
  • 自动宠汪汪_京东脚本.js
  • 自动微信发消息_微信脚本.js
  • 自动集福气

3、大型应用

  • 支付宝蚂蚁森林能量收取

一、全局

waitForPackage(package[, period = 200])//等待指定的应用出现。
waitForPackage("com.tencent.mm")//例如等待当前界面为微信
waitForActivity(activity[, period = 200])//等待指定的Activity出现,period为检查Activity的间隔。
waitForActivity("com.ss.android.ugc.aweme.following.ui.FollowRelationTabActivity")//等待抖音其他用户的关注列表页面出现:
sleep(n)//毫秒数
log("message")//打印日志
toast("message")//气泡提示
toastLog("message")//打印日志并气泡提示
setClip("text")//设置剪贴板内容
exit()//立即停止脚本运行
random(min, max)//随机数

二、应用APP

launch("包名")//通过包名启动应用
launchPackage("包名")//通过包名启动应用
launchApp(appName)//通过名称启动应用
getPackageName(appName)//获取应用名称对应的已安装的应用的包名
getAppName("包名")//获取应用包名对应的已安装的应用的名称
app.openAppSetting("包名")//打开应用的详情页(设置页)。返回false; 否则返回true(全局)
app.editFile("/sdcard/1.txt/);//用其他应用编辑文件文本文件
app.uninstall("com.tencent.mobileqq");//卸载应用
app.openUrl("包名");//浏览器打开网站,Url,如果不以"http://"或"https://“开头则默认是"http://”

三、坐标

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], …)//手势路径,时长2s
gestures([delay1, duration1, [x1, y1], [x2, y2], …], [delay2, duration2, [x3, y3], [x4, y4], …], …)//延时多点手势路径

四、控件

文本控件

setText([i, ]text)//输入框的文本置为text//返回是否输入成功。当找不到对应的文本框时返回false。//i表示i + 1个输入框
input([i, ]text)//输入框文本追加内容text//返回是否输入成功。当找不到对应的文本框时返回false。//i表示i + 1个输入框
click(text[, i])//点击大部分包含文字的按钮
while(!click("扫一扫"));//通常与while同时使用以便点击按钮直至成功
longClick(text[, i]))//长按文本

滑动控件

scrollUp([i])//找到第i+1个可滑动控件上滑或左滑。
scrollDown([i])//找到第i+1个可滑动控件下滑或右滑
className("ImageView").depth(10).findOne().click()//多条件定位点击

方形控件

Rect//UiObject.bounds(), UiObject.boundsInParent()返回的对象。//表示一个长方形(范围)。
Rect.left//长方形左边界的x坐标
Rect.right//长方形右边界的x坐标
Rect.top//长方形上边界的y坐标
Rect.bottom//长方形下边界的y坐标
Rect.centerX()//长方形中点x坐标
Rect.centerY()//长方形中点y坐标
Rect.width()//长方形宽度。通常可以作为控件宽度
Rect.height()//长方形高度。通常可以作为控件高度
device.width来获取屏幕宽度
device.height来获取屏幕高度
Rect.contains(Rect)//返回是否包含另一个长方形r。包含指的是,长方形r在该长方形的里面(包含边界重叠的情况)。
Rect.intersect(Rect)//返回是否和另一个长方形相交。

五、选择器进阶

UiSelector.text(str)//text控件str
UiSelector.textContains(包含)//包含
UiSelector.textStartsWith(前缀)//前缀
UiSelector.textEndsWith(后缀)//后缀
UiSelector.textMatches(正则)//正则
UiSelector.desc(str)//desc控件str
UiSelector.descContains(前缀)//前缀
UiSelector.descStartsWith(prefix)//
UiSelector.descEndsWith(suffix)//
UiSelector.descMatches(正则)//正则
UiSelector.id(str)//id控件str
UiSelector.idContains(包含)//包含
UiSelector.idStartsWith(前缀)//前缀
UiSelector.idEndsWith(后缀)//后缀
UiSelector.idMatches(正则)//正则
UiSelector.className(str)//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)//定位控件的bounds属性为屏幕上显示的范围。
UiSelector.boundsInside(left, top, right, buttom)在参数构成的范围里面查找符合条件的控件。用于限制选择器在某一个区域选择控件。
UiSelector.boundsContains(left, top, right, buttom)在参数构成的范围里面查找符合条件的控件。用于限制控件的范围必须包含所给定的范围。
UiSelector.drawingOrder(number)//为一个控件在父控件中的绘制顺序,通常可以用于区分同一层次的控件。为当前选择器附加控件"drawingOrder等于order"的条件。
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选择器

控件属性

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 控件的布局深度。

控件类型

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()//对控件执行"选中"操作,并返回是否操作成功。"选中"和isSelected()的属性相关
UiObject.collapse()//对控件执行折叠操作,并返回是否操作成功。
UiObject.expand()//对控件执行操作,并返回是否操作成功。
UiObject.show()//对集合中所有控件执行显示操作,并返回是否全部操作成功。
UiObject.scrollUp()//对集合中所有控件执行向上滑的操作,并返回是否全部操作成功。
UiObject.scrollDown()//对集合中所有控件执行向下滑的操作,并返回是否全部操作成功。
UiObject.scrollLeft()//对集合中所有控件执行向左滑的操作,并返回是否全部操作成功。
UiObject.scrollRight()//对集合中所有控件执行向右滑的操作,并返回是否全部操作成功。

children()//返回该控件的所有子控件组成的控件集合。可以用于遍历一个控件的子控件
childCount()//返回子控件数目。
parent()//返回该控件的父控件。如果该控件没有父控件,返回null。
bounds()//返回控件在屏幕上的范围,其值是一个Rect对象。

boundsInParent()//返回控件在父控件中的范围,其值是一个Rect对象。
drawingOrder()//返回控件在父控件中的绘制次序。
id()//获取控件的id,如果一个控件没有id,则返回null。
text()//获取控件的文本,如果控件没有文本,返回""。
findByText(str)//根据文本text在子控件中递归地寻找并返回文本或描述(desc)包含这段文本str的控件,返回它们组成的集合。
findOne(selector)//根据选择器selector在该控件的子控件、孙控件…中搜索符合该选择器条件的控件,并返回找到的第一个控件;如果没有找到符合条件的控件则返回null。
find(selector)//根据选择器selector在该控件的子控件、孙控件…中搜索符合该选择器条件的控件,并返回它们组合的集合。
UiCollection//控件集合, 通过选择器的find(), untilFind()方法返回的对象。
UiCollection.size()//返回集合中的控件数。历史遗留函数,相当于属性length。
UiCollection.get(i)//返回集合中第i+1个控件(UiObject)。历史遗留函数,建议直接使用数组下标的方式访问元素。
UiCollection.each(func)//遍历集合。历史遗留函数,相当于forEach。参考forEach。
empty()//返回控件集合是否为空。
nonEmpty()//返回控件集合是否非空。
UiCollection.find(selector)//根据selector所确定的条件在该控件集合的控件、子控件、孙控件…中找到所有符合条件的控件并返回找到的控件集合。
UiCollection.findOne(selector)//根据选择器selector在该控件集合的控件的子控件、孙控件…中搜索符合该选择器条件的控件,并返回找到的第一个控件;
如果没有找到符合条件的控件则返回null。

模拟按键

back()返回
home()Home键
recents()显示最近任务。
powerDialog()电源键菜单
notifications()拉出通知栏。
quickSettings()显示快速设置(下拉通知栏到底)。
splitScreen()分屏。

例子

一般排列

id("recent_chat_list").className("AbsListView").findOne().scrollForward();

在屏幕上半部分寻找文本控件TextView

//在屏幕上半部分寻找文本控件TextView---------------
var w = className("TextView").boundsInside(0, 0, device.width, device.height / 2).findOne();
log(w.text());

findOne设置延时寻找控件例子

//findOne设置延时寻找控件例子
//启动Auto.js
launchApp("Auto.js");
//在6秒内找出日志图标的控件
var object = id("action_log").findOne(6000);
//如果找到控件则点击
if(object != null){
object.click();
}else{
//否则提示没有找到
toast("没有找到日志图标");
}

findOnce例子

//findOnce例子
let object = text("抖音号").findOnce()
log(object)
if (object != null) {
log("已找到")
} else {
log("Error:未找到")
}

findOnce()例子

// 约宝宝附件的人
object = text("在线").findOnce();
if (object != null) {
log(object.parent().parent().click()) //点击元素
}else {
//错误处理
};

setText例子

//刷屏-------------------
while(true){
className("EditText").findOne().setText("刷屏...");
text("发送").findOne().clicK();
sleep(500); 
}
或者
while(true){
className("EditText").setText("刷屏...");
text("发送").clicK();
sleep(500);
}

启动APP例子

//启动APP------
if (currentPackage() != "com.chaoxing.mobile") {//是否不在APP界面
toast("即将打开超星!"); //直接打开学习通
app.launchApp("学习通");//不在则打开
} else {//否则就是在页面
toast("已经在学习通中,即将开始进行下一步操作!");//不执行操作};

停止APP例子

//强制停止应用------
"auto";
var appName = rawInput("请输入应用名称");
openAppSetting(getPackageName(appName));
while(!click("强制停止"));

发送意图例子

//发送意图-文本消息分享------
var content = rawInput('请输入要分享的文本');
app.startActivity({
action: "android.intent.action.SEND",
type: "text/*",
extras: {
"android.intent.extra.TEXT": content
},
packageName: "com.tencent.mobileqq",
className: "com.tencent.mobileqq.activity.JumpActivity"
});

事件监听

events.onKeyDown(keyName, listener);  // keyName:要监听的按键名称,listener:按键监听器
- volume_up 音量上键
- volume_down 音量下键
- home 主屏幕键
- back 返回键
- menu 菜单键
举个例子:
//启用按键监听
events.observeKey();
//监听"主屏幕键按下
events.onKeyDown("home", function(event){
    toast("主屏幕键被按下了");
});
//监听返回键按下
events.onKeyDown("back", function(event){
    toast("返回键被按下了");
    exit();
});

events.onKeyUp(keyName, listener);  // keyName:要监听的按键名称,listener:按键监听器 
举个例子:
//启用按键监听
events.observeKey();
//监听音量下键弹起
events.onKeyDown("volume_down", function(event){
    toast("音量上键弹起");
});
//监听Home键弹起
events.onKeyDown("home", function(event){
    toast("Home键弹起");
    exit();
});

悬浮窗

floaty.window(layout);   // 指定悬浮窗的布局,创建并显示一个悬浮窗
举个例子:
var w = floaty.window(
    <frame gravity="center">
        <text id="text">悬浮文字</text>
    </frame>
);
setInterval(() => { }, 1000);

floaty.rawWindow(layout); // 指定悬浮窗的布局,创建并显示一个原始悬浮窗,您可以根据自己需要编写任何布局
举个例子:
var w = floaty.rawWindow(
    <frame gravity="center">
        <text id="text">悬浮文字</text>
    </frame>
);

w.setPosition(500, 500);   设置悬浮窗位置。

setTimeout(()=>{
    w.close();
}, 2000);

文件系统

files.createWithDirs(path);  // 创建一个文件或文件夹并返回是否创建成功。如果文件所在文件夹不存在,则先创建他所在的一系列文件夹
举个例子:
files.createWithDirs("/sdcard/新文件夹/新文件夹/新文件夹/1.txt");

files.exists(path);   // 返回在路径path处的文件是否存在。
举个例子:
log(files.exists("/sdcard/新文件夹/新文件夹/新文件夹/1.txt"));

files.read(path[, encoding = "utf-8"]);  // 读取文本文件path的所有内容并返回
举个例子:
log(files.read("/sdcard/1.txt", encoding = "utf-8"));

files.write(path, text);   // 把text写入到文件path中。 新的text会覆盖以前的
举个例子:
var text = "这是一个文件内容";
// 判断是否有此文件,如果没就创建一个
files.createWithDirs("/sdcard/1.txt");
//写入文件
files.write("/sdcard/1.txt", text);
//用其他应用查看文件
app.viewFile("/sdcard/1.txt");

files.append(path, text);  // 把text追加到文件path的末尾
举个例子:
var text = "追加的文件内容";
files.append("/sdcard/1.txt", text);
files.append("/sdcard/1.txt", text);
//用其他应用查看文件
app.viewFile("/sdcard/1.txt");

files.copy(fromPath, toPath);  // 复制文件,返回是否复制成功
举个例子:
files.copy("/sdcard/1.txt", "/sdcard/Download/1.txt");

files.move(fromPath, toPath);  // 移动文件,返回是否移动成功也可改名
举个例子:
files.move("/sdcard/1.txt", "/sdcard/Download/1.txt");

files.getName(path);  // 返回文件的文件名
举个例子:
log(files.getName("/sdcard/1.txt"));

files.remove(path);  // 删除文件或空文件夹,返回是否删除成功
举个例子:
log(files.remove("/sdcard/1.txt"));

files.removeDir(path);  // 删除文件夹,如果文件夹不为空,则删除该文件夹的所有内容再删除该文件夹
举个例子:
log(files.removeDir("/sdcard/1.txt"));

files.getSdcardPath();  // 返回SD卡路径
举个例子:
log(files.getSdcardPath());   // 返回结果:/storage/emulated/0

close();  // 关闭该文件

全局函数

sleep(n);  // n:暂停运行n毫秒的时间。1秒等于1000毫秒。
举个例子:
sleep(1000);  // 暂停运行1秒

currentPackage(); // 返回正在运行的应用的包名
举个例子:
log(currentPackage());  // 返回:org.autojs.autojspro

currentActivity();  // 返回正在运行的Activity的名称
举个例子:
log(currentActivity());  // 返回:org.autojs.autojs.ui.main.MainActivity

toast(message);  // 以气泡显示信息message几秒
举个例子:
toast("你好autoJS"); // 屏幕出现  你好autoJS 字样,几秒后消失

toastLog(message);  // 显示信息message并在控制台中输出
举个例子:
toastLog("你好autoJS");  // 屏幕和控制台同时出现 你好autoJS 字样

waitForActivity(activity]); // activity:等待指定的Activity出现,period:为检查Activity的间隔。
举个例子:
log(waitForActivity("org.autojs.autojs.ui.main.MainActivity")); 

waitForPackage(package);  // 等待指定的应用出现
举个例子:
waitForPackage("org.autojs.autojspro"); 

exit();   // 立即停止脚本运行。

random(min, max);   // 返回一个在[min...max]之间的随机数
举个例子:
log(random(0, 2));   // 返回可能时0,1,2

random();   // 返回一个[0,1)的随机浮点数

HTTP

http.get(url,options,callback);   // 对地址url进行一次GET请求,option:加入请求头,callback:回调函数
举个例子:
console.show();
var r = http.get("www.baidu.com");
log("code = " + r.statusCode);
log("html = " + r.body.string());

option:
console.show();
var r = http.get("www.baidu.com", {
    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'
    }
});
log("code = " + r.statusCode);
log("html = " + r.body.string());

回调函数:
console.show();
http.get("www.baidu.com", {}, function(res, err){
    if(err){
        console.error(err);
        return;
    }
    log("code = " + res.statusCode);
    log("html = " + res.body.string());
});

http.post(url, data, options, callback);  // 对地址url进行一次GET请求,data:POST数据,option:加入请求头,callback:回调函数
举个例子:
var url = "https://login.taobao.com/member/login.jhtml";
var username = "你的用户名";
var password = "你的密码";
var res = http.post(url, {
    "TPL_username": username,
    "TPL_password": password
});
var html = res.body.string();
if(html.contains("页面跳转中")){
    toast("登录成功");
}else{
    toast("登录失败");
}

http.postJson(url, data, options, callback); // 以JSON格式向目标Url发起POST请求。
举个例子:
var url = "http://www.tuling123.com/openapi/api";
r = http.postJson(url, {
    key: "65458a5df537443b89b31f1c03202a80",
    info: "你好啊",
    userid: "1",
});
toastLog(r.body.string());

http.request(url, options, callback);  // 对目标地址url发起一次HTTP请求
____待补充

Response  // HTTP请求的响应。
Response.statusCode  // 当前响应的HTTP状态码。例如200(OK), 404(Not Found)等。
Response.statusMessage // 当前响应的HTTP状态信息。例如"OK", "Bad Request", "Forbidden"。
举个例子:
var res = http.get("www.baidu.com");
if(res.statusCode >= 200 && res.statusCode < 300){
    toast("页面获取成功!");
}else if(res.statusCode == 404){
    toast("页面没找到哦...");
}else{
    toast("错误: " + res.statusCode + " " + res.statusMessage);
}
Response.headers  // 当前响应的HTTP头部信息。
举个例子:
console.show();
var res = http.get("www.qq.com");
console.log("HTTP Headers:")
for(var headerName in res.headers){
    console.log("%s: %s", headerName, res.headers[headerName]);
}
Response.body  // 当前响应的内容
Response.request  // 当前响应所对应的请求
Response.url  // 当前响应所对应的请求URL
Response.method  // 当前响应所对应的HTTP请求的方法。例如"GET", "POST", "PUT"等。

图片与颜色

找图找色
images.requestScreenCapture([landscape])  // 申请截图权限(只需执行一次)
举个例子:
//请求截图
if(!requestScreenCapture()){
    toast("请求截图失败");
    exit();
}
//连续截图10张图片(间隔1秒)并保存到存储卡目录
for(var i = 0; i < 10; i++){
    captureScreen("/sdcard/screen_capture_" + i + ".png");
    sleep(1000);
}

images.captureScreen()  // 截图当前屏幕返回一个Image对象
举个例子:
// 请求横屏截图
requestScreenCapture(true);
// 截图
var img = captureScreen();
// 获取在点(100, 100)的颜色值
var color = images.pixel(img, 100, 100);
// 显示该颜色值
toast(colors.toString(color));

images.captureScreen(path);  // path:截图保存路径
举个例子:
// 请求截图
if(!requestScreenCapture()){
    toast("请求截图失败");
    exit();
}
// 截图保存在指定path
images.captureScreen("/sdcard/DCIM/新建文件夹/1.png");

// 在图片img指定区域中找到颜色和color完全相等的某个点
images.findColorEquals(img, color[, x, y, width, height]); 
举个例子:
requestScreenCapture();  //请求截图
launchApp("QQ");   // 启动QQ
sleep(1200);   // 等待1.2秒
var p = findColorEquals(captureScreen(), "#f64d30");    
if(p){
    toast("有未读消息");
}else{
    toast("没有未读消息");
}

举个例子:
// 请求截图
var 获取截图权限 = requestScreenCapture();
// console.log("获取截图权限===>", 获取截图权限);
// 截图屏幕图片 并放指定位置
images.captureScreen("/sdcard/屏幕大图" + ".png");
// 扣小图片
var 读取图片 = images.read("/sdcard/屏幕大图.png");    // 读取大图
var 小心心 = images.clip(读取图片, 923, 828, 109, 115);   // 根据大图进行xyz裁剪
images.save(小心心, "/sdcard/小心心.png");    // 将图片存储指定位置
var 小图片 = images.read("/sdcard/小心心.png");   // 读取小图片
// var 是否找到 = images.findImage(读取图片, 小图片);   // 根据大图找小图
var 是否找到 = images.findImageInRegion(读取图片, 小图片, 921, 830, 116, 113);   // 根据区域找图
console.log("是否找到===>", 是否找到);

基于控件的操作

auto.waitFor(); // 检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;
click("小红书");   // 点击文本
click("啦啦啦", 0);   // 点击文本 点击第一个文本
longClick("小红书");  // 长按文本
longClick("啦啦啦", 0);  // 长按文本 点击第一个文本
scrollUp(0); //  找到上滑或左滑
setText("测试");  // 输入文本 会清除
input("测试一下"); // 输入文本 会追加后面

var sendButton = text("小红书").findOne().click(); // 定义这个元件  根据文本
sendButton.click();  // 元件点击
desc("搜索").findOne().click();  // 根据desc进行点击
id("action_search").findOne().click();  // 根据id进行点击
className("ImageView").depth(10).findOne().click();  // 组合来完成定位
click(); // 控件clickable为true,才能使用
longClick(); // 控件longClickable属性为true
setText();  // 设置文本,用于编辑控件设置文本  id("search_edit_text").findOne().setText("测试");
exits(); // 判断控件是否存在
waitFor(); // 等待控件出现
scrollForward(); // id("music_list").findOne().scrollForward(); 上滑 如果控件scrollForward属性为true
scrollBackward(); // id("music_list").findOne().scrollBackward();  下滑 scrollBackward属性为true

举个例子:
className("android.widget.EditText").findOne().setText("狐狸");
var 搜索 = text("搜索").findOne().click();
搜索.click();

// 如果控件名以“android.widget.”开头 可以直接省略,例如文本控件可以直接使用
className("TextView"); 
常见控件的类名如下:
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 通常也是列表控件

UiSelector.findOne(timeout);  // 对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止
举个例子:
//启动Auto.js
launchApp("Auto.js");
//在6秒内找出日志图标的控件
var w = id("action_log").findOne(6000);
//如果找到控件则点击
if(w != null){
    w.click();
}else{
    //否则提示没有找到
    toast("没有找到日志图标");
}

UiSelector.findOnce(i);  // 对屏幕上的控件进行搜索,如果找到符合条件的控件则返回该控件 i:索引

UiSelector.find();  // 找出所有满足条件的控件并返回一个控件集合
举个例子:
var c = className("AbsListView").find();
if(c.empty()){   // empty() 返回控件集合是否为空
    toast("找到啦");
}else{
    toast("没找到╭(╯^╰)╮");
}

UiSelector.untilFind();  // 对屏幕上的控件进行搜索,直到找到至少一个满足条件的控件为止  没找到会一直卡在那儿

UiSelector.exists(); // 判断屏幕上是否存在控件
举个例子:
if(text("某个文本").exists()){
    //要支持的动作
    toast("这是某个文本");
}

UiSelector.waitFor();  // 等待屏幕上出现符合条件的控件
举个例子:
textContains("退出").waitFor();   // textContains(str) 为当前选择器附加控件"text需要包含字符串str"的筛选条件
click("退出");

UiSelector.filter(f)  // 为当前选择器附加自定义的过滤条件。
举个例子:
// 要找出屏幕上所有文本长度为10的文本控件的代码为:
var uc = className("TextView").filter(function(w){
    return w.text().length == 10;
});

UiObject.click(); // 点击该控件  需要控件的clickable为true才可使用

UiObject.longClick();  // 长按该控件  需要控件的longClickable为true才可使用

UiObject.setText(text);  // 设置输入框控件的文本内容  需要控件的editable为true才可使用

UiObject.copy();  // 对输入框文本的选中内容进行复制 该函数只能用于输入框控件,并且当前输入框控件有选中的文本
举个例子:
var et = className("EditText").findOne();
//选中前两个字
et.setSelection(0, 2);  // setSelection()  设置输入框选中的内容
//对选中内容进行复制
if(et.copy()){
    toast("复制成功");
}else{
    toast("复制失败");
}
posted @ 2021-04-27 23:04  Daydayup,ran  阅读(3107)  评论(0编辑  收藏  举报