利用bat腳本模擬用戶操作,需要用到兩點:
①就是adb命令了,adb命令可以用來模擬用戶在手機上的操作
②bat語言,就是批處理語言,主要用來進行邏輯處理,跟眾多語言語法一樣,批處理語言也包括for循環、if語句之類的語法;
一、adb命令
首先我們來介紹模擬用戶在手機上操作的adb命令
input keyevent //發送鍵盤事件 用法說明: adb shell input keyevent “value” usage: input ... input text <string> //在EditText中輸入字符串 input keyevent <key code number or name> //模擬back鍵、home鍵、音量鍵等操作 input tap <x> <y> //模擬點擊事件 input swipe <x1> <y1> <x2> <y2> //模擬滑動事件
看看上面的這四個命令是不是已經滿足你日常使用了呢?
先列舉 input keyevent
幾個比較常用的code值:
input keyevent 3 // Home input keyevent 4 // Back input keyevent 19 //Up input keyevent 20 //Down input keyevent 21 //Left input keyevent 22 //Right input keyevent 23 //Select/Ok input keyevent 24 //Volume+ input keyevent 25 // Volume- input keyevent 82 // Menu 菜單~~~
下面來舉個栗子:
①你可以先進入到adb shell
中,再執行input keyevent "value"
,如下,看看是不是執行了home鍵的操作呢:
shell@android:/ $ input keyevent 3
②你也可以不進入adb shell
中,直接執行(在bat腳本中寫的時候當然要用這種啦~),如下:
adb shell input tap 143 1850 //這是點擊了橫坐標為143、縱坐標為1850的像素點 adb shell input swipe 200 100 444 666 //這是從坐標點(200,100)滑動到了坐標(444,666)
========================================
【快速獲取想要點擊圖標像素點的技巧:】想要點擊某個button,但是怎么快速獲取該button的像素位置呢?
一般Android在[設置--高級設置--開發者選項]中,或者[設置--開發人員選項]中,有“指針位置”這一項,打開該開關

如上圖,方框的位置就是你所點擊的區域坐標點,注意,原坐標[0, 0]就是手機屏幕的左上角。
還有一點,如果你在屏幕滑動了一段距離,你想知道滑動距離的坐標數值差,也可以看到:

==================================================
二、bat語言,批處理語言
1,基礎語法
①.批處理文件是一個“.bat”結尾的文本文件,這個文件的每一行都是一條DOS命令。可以使用任何文本文件編輯工具創建和修改。
②.批處理是一種簡單的程序,可以用 if 和 goto 來控制流程,也可以使用 for 循環。
③.批處理的編程能力遠不如C語言等編程語言,也十分不規范。
④.每個編寫好的批處理文件都相當於一個DOS的外部命令,把它所在的目錄放到DOS搜索路徑(path)中,即可在任意位置運行。
⑤.C:\AUTOEXEC.BAT
是每次系統啟動時都會自動運行的,可以將每次啟動時都要運行的命令放入該文件中。
⑥.大小寫不敏感(命令符忽略大小寫)
⑦.批處理的文件擴展名為 .bat 或 .cmd。
⑧.在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe
來運行該文件。
2,如何執行批處理文件
新建一個txt文本文件,寫完代碼之后,保存為XXX.bat
文件,然后雙擊該文件就行~~~

3,先來幾個常用的語法:
①注釋:Rem或::
Rem 這是一行注釋
:: 這也是一行注釋
②打印個log啥的:echo命令
語法:echo [{on|off}] [message]
1), ECHO [message]
顯示信息,此句可以用來打log,例子如下:

2),
ECHO [ON | OFF]
打開回顯或關閉回顯功能。
echo off
表示在此語句后所有運行的命令都不顯示命令行本身,:


3), ECHO
顯示當前回顯設置。

4), 在實際應用中我們會把這條命令和重定向符號( 也稱為管道符號,一般用 > >> ^ )結合來實現輸入一些命令到特定格式的文件中。
echo Windows Registry Editor Version 5.00 > c:\setupreg.reg (此前還沒有 setupreg.reg 這個文件) ```
echo "SourcePath"="D:\Win2003\" >> c:\setupreg.reg (追加內容進 setupreg.reg 這個文件) ```
③ @命令
表示不顯示@后面的命令,(在入侵過程中自然不能讓對方看到你使用的命令啦)
@ 與 echo off
相象,但它是加在每個命令行的最前面,表示運行時不顯示這一行的命令行(只能影響當前行)。
@echo off (此語句常用於開頭,表示不顯示所有的命令行信息,包括此句)
@echo please wait a minite...
@format X: /q/u/autoset ```
④ title 命令
給cmd窗口設置title
title 讀取文件測試腳本


⑤ color命令:設置背景及字體顏色
語法: color bf
b 是指定背景色的十六進制數字; f 指定前景顏色(即字體顏色)。
顏色值: 0:黑色 1:藍色 2:綠色 3:湖藍 4:紅色 5:紫色 6:黃色 7:白色
8:灰色 9:淡藍 A:淡綠 B:淺綠 C:淡紅 D:淡紫 E:淡黃 F:亮白
如果沒有給定任何參數,該命令會將顏色還原到 CMD.EXE
啟動時的顏色。
如果兩參數一樣,視為無效輸入。只有一個參數時,設置字體。
⑥ Pause命令:
可以自己試一下,挺有用的功能,會暫停批處理的執行並在屏幕上顯示Press any key to continue...
的提示,等待用戶按任意鍵后繼續
⑦打開某網站
start iexplore.exe http://www.baidu.com
start chrome.exe http://www.baidu.com
⑧延時執行下一句語句:
ping -n N 127.1 >nul
執行該語句,就會延遲執行N-1秒
4,For語句
For語句是比較重要的語法,網上已經有很多人做了各種解釋說明,我就不再做重復的輪子了,找了兩篇介紹的比較清楚易懂的for語句帖子供大家交流:
http://blog.csdn.net/pigchan/article/details/5066098
http://www.jb51.net/article/17908.htm
5,Set語句
同上,set語句的帖子:http://blog.csdn.net/anye3000/article/details/8443738
6,If語句
if 表示將判斷是否符合規定的條件,從而決定執行不同的命令。有三種格式:
① IF
語法:if [not] "參數" == "字符串" 待執行的命令
參數如果等於(not表示不等,下同)指定的字符串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號)
if "%1" == "a" format a: if {%1} == {} goto noparms
② if exist
語法: if [not] exist [路徑\]文件名 待執行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。
if exist config.sys edit config.sys (表示如果存在這文件,則編輯它,用很難看的系統編輯器)
if exist config.sys type config.sys (表示如果存在這文件,則顯示它的內容)
if errorlevel number
語法:if [not] errorlevel <數字> 待執行的命令
如果程序返回值等於指定的數字,則條件成立,運行命令,否則運行下一句。(返回值必須按照從大到小的順序排列)
@echo off XCOPY F:\test.bat D:\ IF ERRORLEVEL 1 (ECHO 文件拷貝失敗 ) Else IF ERRORLEVEL 0 ECHO 成功拷貝文件 pause
很多DOS程序在運行結束后會返回一個數字值用來表示程序運行的結果(或者狀態),稱為錯誤碼errorlevel或稱返回碼。
常見的返回碼為0、1。通過if errorlevel
命令可以判斷程序的返回值,根據不同的返回值來決定執行不同的命令。
④ else
語法:if 條件 (成立時執行的命令) else (不成立時執行的命令)
如果是多個條件,建議適當使用括號把各條件包起來,以免出錯。
if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else (echo comment3 ) 注:如果 else 的語句需要換行,if 執行的行尾需用“^”連接,並且 if 執行的動作需用(括起來),否則報錯 if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) ^ else (echo comment3 )
⑤ 比較運算符:
EQU - 等於 (一般使用“==”) NEQ - 不等於 (沒有 “!=”,改用“ if not 1==1 ”的寫法) LSS - 小於 LEQ - 小於或等於 GTR - 大於 GEQ - 大於或等於
7,Goto語句
語法:goto label
(label是參數,指定所要轉向的批處理程序中的行。)
指定跳轉到標簽行,找到標簽行后,程序將處理從下一行開始的命令。
label標簽的名字可以隨便起,但是最好是有意義的,字母前必須加個冒號“:”來表示這個字母是標簽。
goto命令就是根據這個冒號來尋找下一步跳到到那里。經常與 if 配合使用,根據不同的條件來執行不同的命令組。
@echo off :begin copy a:*.* d:\back echo Please put a new disk into driver A goto begin
8,Call語句
Call 命令可以在批處理執行過程中調用另一個批處理,當另一個批處理執行完后再繼續執行原來的批處理,類似於java中的方法調用,還可以傳遞參數,跟goto語句還是有區別的。
語法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
參數: [Drive:][Path] FileName
指定要調用的批處理程序的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴展名。 調用另一個批處理程序,並且不終止父批處理程序。 如果不用call而直接調用別的批處理文件,那么執行完那個批處理文件后將無法返回當前文件並執行當前文件的后續命令。 call 命令接受用作調用目標的標簽。如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。
call="%cd%\test2.bat" haha kkk aaa (調用指定目錄下的 test2.bat,且輸入3個參數給他) call test2.bat arg1 arg2 (調用同目錄下的 test2.bat,且輸入2個參數給他)
請參考如下帖子:http://blog.csdn.net/stpeace/article/details/9041453
三、舉個栗子
下面來舉個栗子,是一個循環自動登錄的功能,從一個文檔中,提取用戶名、密碼,把用戶名密碼一次輸入App的EditText中,最后點擊登錄。
首先,登錄界面如下:

然后呢,我們准備了10條數據,別人給我的時候是存在excel表里的,如下

為了能讓腳本方便調用,我們把它轉存為txt文件,文件名為data.txt

好了,前期工作准備完畢,現在看下代碼怎么寫的:
@echo off title 讀取文件測試腳本 //設置title color 3a //設置命令行窗口顏色 adb shell input keyevent 3 //點了一次home鍵,回到首頁 adb shell am start com.gaoyang.testapp //根據包名啟動app ping -n 11 127.1 >nul //啟動app可能需要點時間,我們延時10秒再向下執行 setlocal enabledelayedexpansion set /a num=0 //初始化變量num,用來記錄循環次數 :loop set /a num+=1 //每循環一次,加1 echo 第!num!遍 //輸出log,第幾次 for /f "tokens=1-3" %%i in (data.txt) do ( //循環讀取數據 if %%i==!num! (<span style="white-space:pre"> </span> if %%i==11 goto end //當循環次數等於11的時候,退出循環,退出程序,因為我們只有10條數據 call :execute %%j %%k //調用模擬用戶行為的操作 %%j %%k為傳到execute方法去的參數,分別代表用戶名、密碼 goto loop) ) :end echo 結束了 goto eof :execute echo username: %1 //打印log,用戶名 echo password: %2 //打印log,密碼 ::【登錄操作】 ::點擊用戶名框 adb shell input tap 268 1734 ::輸入用戶名 adb shell input text %1 ::點擊密碼框 adb shell input tap 654 572 ::輸入密碼 adb shell input text %2 ::點擊登錄button,登錄 adb shell input tap 630 870