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("復制失敗");
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM