一 使用目的
該工具主要是基于appium,可以面向Android和Ios移動App,或H5或微信等應(yīng)用的,基于元素識別的UI自動化遍歷測試.
該工具特點:
1.支持最新的appium 1.8.1 (AppCrawler支持1.7.0)
2.安卓方向支持monkey配置遍歷.
3.結(jié)果報告上看,支持Crash信息搜集.會對操作過程錄制視頻.會對操作過程每動作截圖.
其他優(yōu)質(zhì)特性詳見github主頁說明
二 資源索引
官方資源
UICrawler Github
UICrawler 配置文件說明
UICrawler 環(huán)境配置說明
博客相關(guān)
基于 Appium 的 App UI 遍歷工具 (支持操作步驟回放)
網(wǎng)盤下載鏈接
三 環(huán)境準(zhǔn)備
以安卓方向取重點:
Oracle Java部署
下載地址 http://www.oracle.com/technetwork/java/javase/downloads/index.html
找到合適的java版本下載,我選擇的是jdk-8u91-windows-x64.exe。按步驟安裝即可。安裝路徑一般默認。
配置java 環(huán)境變量:
JAVA_HOME 變量值為JDK的安裝目錄,筆者為C:\Program Files\Java\jdk1.8.0_91
PATH PATH變量值后追加 ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
CLASSPATH 變量值為 ;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
檢查是否安裝成功
C:\Users\cmd>java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
Android sdk部署
下載地址 android-sdk_r24.4.1-windows 處下載 android-sdk_r24.4.1-windows.zip
將android-sdk-windows解壓到你需要的目錄下,筆者是D:\Android\android-sdk-windows
配置android-sdk環(huán)境變量:
ANDROID_HOME 變量值為android-sdk的解壓目錄,筆者為D:\Android\android-sdk-windows
PATH PATH變量值的最后追加 ;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\build-tools;
接下來你便可以用D:\Android\android-sdk-windows 下的SDK Manager.exe下載配置SDK 或AVD Manager.exe 配置 AVD模擬器了。
如果你需要測試android應(yīng)用的話,請先安裝配置好某一版本的SDK及其相關(guān)工具。
如下圖,SDK manager必要配置:
Tools->Options設(shè)置:
[圖片上傳失敗...(image-3294ca-1528341709166)]
其它要下載的:
我目前的配置是
[圖片上傳失敗...(image-9ac803-1528341709166)]
此處的按需選擇與AVD模擬器配套使用的:
[圖片上傳失敗...(image-8bf55c-1528341709166)]
[圖片上傳失敗...(image-585a9a-1528341709166)]
#檢查下最終的adb版本
C:\Users\cmd>adb version
Android Debug Bridge version 1.0.39
Version 0.0.1-4500957
Installed as D:\Android\android-sdk-windows\platform-tools\adb.exe
appium部署
可以用兩種方式:
一種就是直接用desktop版本, [appium-desktop](https://github.com/appium/appium-desktop/releases/tag/v1.6.1)
一種就是nodejs部署參考,[教您完美 win10 安裝 Appium1.7.2 支持 win 客戶端自動化](https://testerhome.com/topics/12988)
(建議使用nodejs部署方式,該文可以完美安裝當(dāng)然你不做winuiauto的話可以忽略文中提到的那些winuiauto相關(guān)的報錯)
手機真機相關(guān)設(shè)置
真機小米Mix2
需要開啟真機開發(fā)者選項->USB調(diào)試,模式和其他相關(guān),主要是調(diào)試這一欄要打開的有
哦,還有就是接上手機的時候,小米Mix會提示選擇"USB用途" (有 1 僅限充電 2 傳輸文件MTP 3傳輸照片 PTP) 你需要選擇 傳輸文件MTP 該項.否則 adb devices -l會報一個類似權(quán)限未獲取到的提示.
部署UICrawler相關(guān)
目前尚未完全開源,可以直接去網(wǎng)盤下載UICrawler-2.0.jar和config.yml 到本地磁盤即可.
我是先 git clone https://github.com/lgxqf/UICrawler.git 然后將上述下載的文件放入.
先通過自帶的-h 命令檢查UICrawler-2.0 是否正常
D:\UICrawler>java -jar UICrawler-2.0.jar -h
15:32:08.083 [main] INFO Crawler - -h Print this usage information
-a Android package's main activity
-b iOS bundle id
-c Maximum click count
-f Yaml config file
-m run monkey
-p Android package name
-t Appium port
-u Device serial
-w wda port for ios
四 配置修改
config.yml 用文本編輯器打開,個人推薦win環(huán)境用Notepad++,ubuntu環(huán)境用Notepadqq.
并且打開"顯示所有字符",以便查看是否符合yml文件編輯格式規(guī)范,空格 回車換行符什么的.
附上最終修改后配置:
GENERAL:
#截屏數(shù)量
SCREENSHOT_COUNT: 500
#Crash時截圖顯示步驟數(shù)量
CRASH_PIC_COUNT: 5
#遍歷深度
MAX_DEPTH: 2000
#點擊次數(shù)
MAX_CLICK_COUNT: 100000
#TIME
DEFAULT_WAIT_SEC: 10
#查找元素的間隔時間
DEFAULT_POLLING_INTERVAL_SEC: 5
DEFAULT_VALUE:
#Appium server IP, 0.0.0.0代表Server在本地
APPIUM_SERVER_IP: 0.0.0.0
#Appium端口
PORT: 4723
#IOS 才會用到WDA_PORT
IOS_WDA_PORT: 8001
#是否忽略Crash,設(shè)為true時,crash后會重啟app然后繼續(xù)遍歷
IGNORE_CRASH: true
ENABLE_VERTICAL_SWIPE: true
#設(shè)置事件百分比 各事件百分比之和為100
MONKEY:
#運行時間,以分鐘計
MONKEY_RUNNING_TIME: 180
#以下各項值總和需為100
#滑動事件百分比
SWIPE_RATIO: 10
#點擊事件百分比
CLICK_RATIO: 80
#點擊MONKEY_SPECIAL_POINT_LIST中的坐標(biāo) 主要用于觸發(fā)"返回"功能
CLICK_SPECIAL_POINT_RATIO: 10
#重啟APP事件百分比
RESTART_APP_RATIO: 0
#特殊坐標(biāo)長按(10秒)
LONG_PRESS_RATIO: 0
#Android Only按Home鍵事件百分比
HOME_KEY_RATIO: 0
#Gesture http://www.lxweimin.com/p/095e81f21e07
DOUBLE_TAP_RATIO: 0
PINCH_RATIO: 0
UNPINCH_RATIO: 0
MONKEY_LIST:
#提高測試效率,點擊以下點(x,y)時會觸發(fā)"后退"操作,避免在一個頁面停留時間太久
MONKEY_SPECIAL_POINT_LIST:
- '80,160'
#根據(jù)以下坐標(biāo)長按10秒
LONG_PRESS_LIST:
- '980,560'
#設(shè)置不點擊的區(qū)域, radius用來設(shè)置以下列坐標(biāo)為圓心,不想點擊的半徑區(qū)域
MONKEY_BLACKLIST_POINT_LIST:
- 'radius,10'
- '0,0'
#小程序
MINI_PROGRAM:
MINI_PROGRAM_NAME: 學(xué)而思營業(yè)廳
MINI_PROGRAM_PROCESS: com.tencent.mm:appbrand1
#以下的內(nèi)容很關(guān)鍵,而且需要根據(jù)不同的APP定制
CRITICAL_ELEMENT:
#Android 包名和啟動的Activity
ANDROID_PACKAGE: com.***.***
ANDROID_MAIN_ACTIVITY: .Loading
#IOS Bundle ID com.apple.mobilesafari
IOS_BUNDLE_ID: com.tencent.xin
#手機桌面上顯示的APP的名字
IOS_BUNDLE_NAME: 微信
#IPA名字的前綴
IOS_IPA_NAME: wechat
#構(gòu)建XPATH需要的一些內(nèi)容
#UI底部TabBar
ANDROID_BOTTOM_TAB_BAR_ID: com.***.***:id/mainTabLayout
IOS_BOTTOM_TAB_BAR_TYPE: XCUIElementTypeTabBar
#注意屬性值要加引號''
ANDROID_CLICK_XPATH_HEADER: "http://*[contains(name(), 'Text') and string-length(@text)<10] | //*[contains(name(), 'Image')] | //*[contains(name(), 'Button')]"
IOS_CLICK_XPATH_HEADER: '@visible="true" and string-length(@value)<30'
#注意屬性值要加雙引號""
ANDROID_USERNAME:
XPATH: '//*[@resource-id="com.***.***:id/account_num"]'
ACTION: input
VALUE: '137*********'
ANDROID_PASSWORD:
XPATH: '//*[@resource-id="com.***.***:id/pwd"]'
ACTION: input
VALUE: 'password123'
ANDROID_LOGIN_BUTTON:
XPATH: '//*[@resource-id="com.***.***:id/loginbtn"]'
ACTION: click
#IOS LOGIN_ELEMENT
IOS_USERNAME:
XPATH: '//*[@type="XCUIElementTypeTextField"]'
ACTION: input
VALUE: '130xxxxx456'
IOS_PASSWORD:
XPATH: '//*[@type="XCUIElementTypeSecureTextField" and @value="請輸入登錄密碼"]'
ACTION: input
VALUE: '111111'
IOS_LOGIN_BUTTON:
XPATH: '//*[@type="XCUIElementTypeButton" and @name="登錄" and @label="登錄"]'
ACTION: click
LIST:
#待輸入文件本的控制類型
INPUT_CLASS_LIST:
- android.widget.TextView
- XCUIElementTypeTextField
- XCUIElementTypeSecureTextField
#待輸入的文本
INPUT_TEXT_LIST:
- '123'
- 'ABC'
#當(dāng)發(fā)現(xiàn)App跳轉(zhuǎn)到一下app時 會觸發(fā)back鍵
PRESS_BACK_KEY_PACKAGE_LIST:
- 高德地圖
- com.autonavi.minimap
- com.android.settings
#除了APP本身的包名外 根據(jù)以下包名判斷是否跳出了APP.android當(dāng)app跳轉(zhuǎn)到以下app時被認為是合法,會繼續(xù)遍歷操作.
ANDROID_VALID_PACKAGE_LIST:
- com.miui.securitycenter
- com.android.server.telecom
- com.lbe.security.miui
- gallery
- packageinstaller
#ios 當(dāng)app跳轉(zhuǎn)到以下app時被認為是合法,會繼續(xù)遍歷操作
IOS_VALID_BUNDLE_LIST:
- 照片
#白名單
ITEM_WHITE_LIST:
- 確定
- 允許
- 退出
- 取消
- 已解決
#不點擊包含以下文本的控件
ITEM_BLACKLIST:
- 客服
- 電話
- 不允許
- 拒絕
- 拍照
- 禁止
- 呼叫
- 低電量模式
- 關(guān)閉
#以下類型的元素及子元素不會被點擊
IOS_EXCLUDE_BAR:
#手機狀態(tài)欄
- XCUIElementTypeStatusBar
#鍵盤
- XCUIElementTypeKeyboard
#iOS不點擊以下類型的元素
IOS_EXCLUDE_TYPE:
- XCUIElementTypeOther
- XCUIElementTypeKey
- XCUIElementTypeWindow
- XCUIElementTypeApplication
#android中不點擊以下類型的元素
ANDROID_EXCLUDE_TYPE:
- android.widget.FrameLayout
# - android.widget.ImageButton
NODE_NAME_EXCLUDE_LIST:
- selected
- instance
- checked
- naf
- content
STRUCTURE_NODE_NAME_EXCLUDE_LIST:
#iOS
#- value
- name
#Android
- text
修改的地方并不多,大家可以用diff比較工具和原版的config.yml比較.
重點說一下這段配置:
原配置如下,含義既是遇到文本元素且<30的都點擊
#注意屬性值要加引號''
ANDROID_CLICK_XPATH_HEADER: 'string-length(@text)<30'
IOS_CLICK_XPATH_HEADER: '@visible="true" and string-length(@value)<30'
該段不支持如下寫,比如我想如下寫,可以跑起來,但拼接出來的"clickable elements xpath:"比較怪異且最后腳本端會報錯停止,咨詢后發(fā)現(xiàn)作者并不打算支持如下寫法.
#注意屬性值要加引號''
ANDROID_CLICK_XPATH_HEADER:
- "http://*[contains(name(), 'Text') and string-length(@text)<10]"
- "http://*[contains(name(), 'Image')]"
- "http://*[contains(name(), 'Button')]"
IOS_CLICK_XPATH_HEADER: '@visible="true" and string-length(@value)<30'
最終查了下xpath語法知識,可以用 | 或來連接多個并列屬性,這樣跑不會報錯且正常.這樣就可以點擊文本長度大于3小于10,和點擊所有圖片和Button元素.
#注意屬性值要加引號''
ANDROID_CLICK_XPATH_HEADER: "http://*[contains(name(), 'Text') and string-length(@text)>3 and string-length(@text)<10] | //*[contains(name(), 'Image')] | //*[contains(name(), 'Button')]"
IOS_CLICK_XPATH_HEADER: '@visible="true" and string-length(@value)<30'
五 執(zhí)行
先通過adb命令檢查小米Mix2真機是否連接正常,且確認真機開發(fā)者選項相關(guān)開啟.
C:\Users\cmd>adb devices -l
List of devices attached
yourSerialNo device product:chiron model:MIX_2 device:chiron
啟動appium server
C:\Users\cmd>appium --session-override
切到UICrawler-2.0.jar目錄下執(zhí)行即可.
D:\UICrawler>java -jar UICrawler-2.0.jar -f config.yml -u yourSerialNo
PS:
注意首次運行自動化腳本時候會向手機安裝的相關(guān)有:
Unlock
Appium Android Input Manager
Appium Settings
io.appium.uiautomator2.Server.test
io.appium.uiautomator2.Server
六 執(zhí)行結(jié)果
會按SerialNo+日期時間生成結(jié)果目錄:
報告如圖:
以上配置和jar包在win10和ubuntu18.04均測試正常通過.
其他配置項繼續(xù)測試中...
七 運行UICrawler Monkey
截取部分相關(guān)說明,熟悉基本原生monkey的便可明白,下述配置既是指只運行點擊事件的配置.
#設(shè)置事件百分比 各事件百分比之和為100
MONKEY:
#運行時間,以分鐘計
MONKEY_RUNNING_TIME: 180
#以下各項值總和需為100
#滑動事件百分比
SWIPE_RATIO: 0
#點擊事件百分比
CLICK_RATIO: 100
#點擊MONKEY_SPECIAL_POINT_LIST中的坐標(biāo) 主要用于觸發(fā)"返回"功能
CLICK_SPECIAL_POINT_RATIO: 0
#重啟APP事件百分比
RESTART_APP_RATIO: 0
#對應(yīng) LONG_PRESS_LIST:特殊坐標(biāo)長按(10秒)
LONG_PRESS_RATIO: 0
#Android Only按Home鍵事件百分比
HOME_KEY_RATIO: 0
#Gesture http://www.lxweimin.com/p/095e81f21e07
DOUBLE_TAP_RATIO: 0
PINCH_RATIO: 0
UNPINCH_RATIO: 0
MONKEY_LIST:
#提高測試效率,點擊以下點(x,y)時會觸發(fā)"后退"操作,避免在一個頁面停留時間太久
MONKEY_SPECIAL_POINT_LIST:
- '70,140'
#根據(jù)以下坐標(biāo)長按10秒
LONG_PRESS_LIST:
- '980,560'
#設(shè)置不點擊的區(qū)域, radius用來設(shè)置以下列坐標(biāo)為圓心,不想點擊的半徑區(qū)域
#MONKEY_BLACKLIST_POINT_LIST:
#- 'radius,10'
#- '0,0'
啟動appium server
C:\Users\cmd>appium --session-override
傳參-m 即可運行配置中的monkey相關(guān)設(shè)置
java -jar UICrawler-2.0.jar -f config.yml -u yourSerialNo -m
Tips
作者調(diào)起的是非原生monkey,所以當(dāng)你發(fā)現(xiàn)無法正常關(guān)掉UICrawler Monkey,一直在手機中繼續(xù)跑點擊的時候,使用
# Linux下
adb shell ps |grep monkey
# windows cmd下
adb shell ps | findstr monkey
# 或
adb sehll ps | find "monkey" 找到返回的進程號
#然后 kill掉該手機內(nèi)原生monkey進程
adb shell kill [剛才查到的進程號]
# 如windows下 原生monkey類似com.android.commands.monkey:
adb shell ps| findstr monkey
USER PID PPID VSIZE RSS WCHAN PC NAME
shell 13846 1032 2073652 51480 futex_wait 7f900d7ef0 S com.android.commands.monkey
是找不到該進程,也甭想kill掉的, 我們可以 ps -ef|grep UICrawler 相關(guān)結(jié)束掉本機腳本端的那個java進程也就是 . "java -jar UICrawler-2.0.jar -f config.yml -u yourSerialNo -m" 該進程
monkey配置部分說明1
關(guān)于坐標(biāo)查看,可以打開開發(fā)者選項,"輸入"該節(jié)下的 "指針位置".這樣就可以看到坐標(biāo)系了.
MONKEY_LIST:
#提高測試效率,點擊以下點(x,y)時會觸發(fā)"后退"操作,避免在一個頁面停留時間太久
MONKEY_SPECIAL_POINT_LIST:
- '80,160'
#設(shè)置不點擊的區(qū)域, radius用來設(shè)置以下列坐標(biāo)為圓心,不想點擊的半徑區(qū)域
MONKEY_BLACKLIST_POINT_LIST:
- 'radius,10'
- '0,0'
第一個坐標(biāo)'80,160',是左上的一般安卓app里的"返回"區(qū)域,
第二個坐標(biāo) - 'radius,10' - '0,0' ,這里 0,0 的話 應(yīng)該不就是app界面左上區(qū)域起始點, 然后 x y偏移10 畫個圓 ,不又是一般安卓app里的 "返回"區(qū)域?
這樣 這兩個 第1個 和 第3個不就沖突了?
這時如果,第1和2沖突時,以2為準(zhǔn) . 即以上效果為不點擊左上那個區(qū)域, 也就是一般的app返回區(qū)域.
monkey配置部分說明2
#設(shè)置事件百分比 各事件百分比之和為100
MONKEY:
#運行時間,以分鐘計
MONKEY_RUNNING_TIME: 180
#以下各項值總和需為100
#滑動事件百分比
SWIPE_RATIO: 10
#點擊事件百分比
CLICK_RATIO: 80
#點擊MONKEY_SPECIAL_POINT_LIST中的坐標(biāo) 主要用于觸發(fā)"返回"功能
CLICK_SPECIAL_POINT_RATIO: 10
#重啟APP事件百分比
RESTART_APP_RATIO: 0
#對應(yīng) LONG_PRESS_LIST:特殊坐標(biāo)長按(10秒)
LONG_PRESS_RATIO: 0
#Android Only按Home鍵事件百分比
HOME_KEY_RATIO: 0
#Gesture http://www.lxweimin.com/p/095e81f21e07
DOUBLE_TAP_RATIO: 0
PINCH_RATIO: 0
UNPINCH_RATIO: 0
MONKEY_LIST:
#提高測試效率,點擊以下點(x,y)時會觸發(fā)"后退"操作,避免在一個頁面停留時間太久
MONKEY_SPECIAL_POINT_LIST:
- '70,140'
#根據(jù)以下坐標(biāo)長按10秒
LONG_PRESS_LIST:
- '980,560'
#設(shè)置不點擊的區(qū)域, radius用來設(shè)置以下列坐標(biāo)為圓心,不想點擊的半徑區(qū)域
#MONKEY_BLACKLIST_POINT_LIST:
#- 'radius,10'
#- '0,0'
該節(jié)為所有UICrawler Monkey配置
1 MONKEY: 該節(jié) 要注意所有事件比率百分比之和要為100,
2 MONKEY_LIST: 中的 "MONKEY_SPECIAL_POINT_LIST: "對應(yīng) MONKEY:節(jié)的"#點擊MONKEY_SPECIAL_POINT_LIST中的坐標(biāo) 主要用于觸發(fā)"返回"功能
CLICK_SPECIAL_POINT_RATIO: 10"
3 MONKEY_LIST: 中的 "LONG_PRESS_LIST:" 對應(yīng) 對應(yīng) MONKEY:節(jié)的" #對應(yīng) LONG_PRESS_LIST:特殊坐標(biāo)長按(10秒)
LONG_PRESS_RATIO: 0"
那么上述配置的意思就是,執(zhí)行點擊事件80%,執(zhí)行滑動事件10%,點擊特殊區(qū)域坐標(biāo)事件10%
八 結(jié)語
之前一直用AppCrawler 也很優(yōu)秀,但無奈作者老大搞學(xué)院培訓(xùn),無心維護和深入繼續(xù)開發(fā),支持也一直停留在appium1.7.0.
這也就算了,答應(yīng)過的放出來打算做的特性都還沒兌現(xiàn)....
比較使用這兩個工具,執(zhí)行穩(wěn)定性上UICrawler可以連續(xù)跑很久(我最長跑了1小時回來還在繼續(xù)跑且當(dāng)前腳本配置來看截圖執(zhí)行的點擊比較細膩且有規(guī)律),且腳本執(zhí)行端不會報錯,但AppCrawler 10次 會有個3次左右,腳本執(zhí)行端會報錯且無法繼續(xù)執(zhí)行下去,另有些配置效果AppCrawler 我并未完全吃透和試驗出來.
補充說明
2018年6月29日追加
目前時間截點的config版本,該配置參數(shù)MONKEY_RUNNING_TIME: 6 已被CRAWLER_RUNNING_TIME 合并。請已官方github發(fā)布為準(zhǔn)。
cmd@TR:~/UICrawler$ java -jar UICrawler-2.0.jar -h
16:41:03.088 [main] INFO Crawler - -h Print this usage information
-a Android package's main activity
-b iOS bundle id
-c Maximum click count
-d Maximum crawler UI depth
-f Yaml config file
-i ignore crash
-l loop count
-m run monkey
-p Android package name
-r Crawler running time
-t Appium port
-u Device serial
-v Version
-w WDA port for ios
-p 指定package 就會保證不退出app 或者退出APP了 能自己再重起.
-l loop count 循環(huán)次數(shù),即一個Crawler running time遍歷時間結(jié)束后,繼續(xù)再跑幾個Crawler running time。比如遍歷時間6分鐘,6分鐘結(jié)束后 ,如果-l 是3 那就繼續(xù)再跑2遍6分鐘遍歷,共3次。
#當(dāng)發(fā)現(xiàn)App跳轉(zhuǎn)到以下app時 會觸發(fā)back鍵
PRESS_BACK_KEY_PACKAGE_LIST:
- 高德地圖
- com.autonavi.minimap
- com.android.settings
getpacgesource 里返回的值 只要contains 關(guān)鍵字 就trigger back key 。即遇到當(dāng)前被遍歷的界面上包含配置的關(guān)鍵字即會觸發(fā)back鍵。
疑惑與答疑
那這段配置遇到以下app 就back 是為了什么效果?跳到高德以后 會返回到app,不然會一直在高德里遍歷。
..................... 那不和 -p 一樣的效果 (-p 發(fā)現(xiàn)遍歷的不是指定app了 也要重起app)
不一樣啊,重啟launch app 和觸發(fā)返回 操作不一樣 你想想是不是。
那就是面向兩種場景的處理,保證不跳出遍歷app。
補充記錄:
2018年10月24日
已升級為appium1.9.1 ,在ubuntu18.04.1 windows10 升級后,均重跑UICrawler2.21 config 配置不變成功
升級記錄
https://testerhome.com/topics/12988#reply10
(以上為win10版本且?guī)еС肿鰓in32 uwp win應(yīng)用UI自動化的appium1.9.1升級方式.)