[TOC]
Appium教程
Appium簡(jiǎn)介
Appium是一款開源的Appium自動(dòng)化工具, 基于Webdriver協(xié)議, 主要有以下3個(gè)特點(diǎn):
- 全能: 支持iOS/Andorid/H5/混合App/WinApp
- 通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各種語言
- 開源: 免費(fèi)
App自動(dòng)化測(cè)試工具對(duì)比
iOS
官方:
- Uiautomation/XCUITest: 白盒, UI測(cè)試, JS
其他: - FastMonkey: 性能(仿Monkey), 張釗
Andorid
官方:
- Uiautomator/Uiautomtor2: UI測(cè)試, Java
- Monkey: app性能/穩(wěn)定性測(cè)試, 隨機(jī)操作
- MonkeyRunner: UI測(cè)試, Jpython, 只能通過坐標(biāo)定位
- Robotium: 白盒, UI測(cè)試, Java, 支持Webview/Toast/menu/Dialog等, 無法跨進(jìn)程
- Espresso: 官方推薦擴(kuò)展測(cè)試包, 白盒,ui, 一般開發(fā)自測(cè)使用
- CTS: 兼容性測(cè)試, Java
其他:
- Python-Uiautomotor2: UI測(cè)試, 使用簡(jiǎn)單, 支持無線連接設(shè)備及使用weditor查看元素定位
- Adb-For-Test/adb-For-Robotium: 個(gè)人, 基于adb命令的封裝
多平臺(tái)支持
- Calabash: iOS/Andriod/混合app, Ruby, BDD模式, Api豐富
- Appium: iOS/Andriod/混合app/H5, Java/Python/Ruby/JS..
- Macaco: 阿里基于Appium進(jìn)行的精簡(jiǎn)封裝的一套框架, 支持Electron應(yīng)用, 包含app-inspector和ui-recorder, 統(tǒng)一了iOS/Android操作的Api, 目前坑比較多, 環(huán)境搭建較麻煩
- Airtest(ATS): 網(wǎng)易推出的一款基于截圖對(duì)比的App自動(dòng)化測(cè)試工具, 可用于App游戲UI測(cè)試, 支持iOS/Android
云平臺(tái)
- Sauce Labs: Appium官方推薦, 應(yīng)用最廣的云測(cè)平臺(tái), 收費(fèi)
- Testin/騰訊云測(cè)等: 國(guó)內(nèi)云平臺(tái), 收費(fèi)
- OpenSTF: 開源手機(jī)集群管理平臺(tái), 免費(fèi)
Appium實(shí)現(xiàn)原理
Andorid(uiautomator)
- 調(diào)用Android adb完成基本的系統(tǒng)操作
- 向Android上部署bootstrap.jar
- bootstrap.jar Forward Android的端口到PC機(jī)器上
- PC上監(jiān)聽端口接收請(qǐng)求咒程,使用webdriver協(xié)議
- 分析命令并通過forward 端口發(fā)給bootstrap.jar
- bootstrap.jar接收請(qǐng)求并把命令發(fā)給uiautomator
- ui automator執(zhí)行命令
Andorid-uiautomator2-driver: bootstrap.jar改為使用uiautomato2 server apk, 使用netty server代替原來的websocket與PC端通信
iOS
- client端 依然是 test script是我們的webdriver測(cè)試腳本蚤霞。
- 中間是起的Appium的服務(wù)脸爱,Appium在服務(wù)端起了一個(gè)Server(4723端口)用爪,跟selenium Webdriver測(cè)試框架類似活逆, Appium?持標(biāo)準(zhǔn)的WebDriver JSONWireProtocol憔鬼。在這里提供它提供了一套R(shí)EST的接口,Appium Server接收web driver client標(biāo)準(zhǔn)rest請(qǐng)求棠众,解析請(qǐng)求內(nèi)容荞怒,調(diào)?用對(duì)應(yīng)的框架響應(yīng)操作。
- appium server調(diào)用instruments.js 啟動(dòng)?一個(gè)socket server察纯,同時(shí)分出一個(gè)?子進(jìn)程運(yùn)?instruments.app帕棉,將bootstrap.js(一個(gè)UIAutomation腳本)注?入到device?于和外界進(jìn)行交互
- 最后Bootstrap.js將執(zhí)行的結(jié)果返回給appium server
- appium server再將結(jié)果返回給 appium client。
環(huán)境搭建
- 安裝JDK, 配置環(huán)境變量
- 安裝Android SDK, 配置環(huán)境變量
- 安裝Appium-Windows-Desktop
- 安裝Appium-Python-Client
- 安裝模擬器
Mac Android/iOS環(huán)境搭建
Andorid介紹
基本架構(gòu)
常見布局/視圖
- 線性布局: LinerLayout
- 相對(duì)布局: RelativeLayout
- 幀布局: FrameLayout, 疊放
- 普通視圖: View
- 切換視圖: ListView, 注意, 其中的元素會(huì)動(dòng)態(tài)變化
HierarchyViewer, uiautomatorviewer
基本控件
- TextView: 文本
- Button: 按鈕
- EditText: 輸入框
- ImageView: 圖片
- 其他: Alert(警告框)/Toast(提示消息)/SeekBar(滑塊)/Webview(嵌入網(wǎng)頁)
控件常見屬性
index: 索引, 用于排序
text: 控件名稱(顯示文本)
resource-id: 資源id
class: 控件類型(文本/按鈕/輸入框等)
content-desc: 控件描述
package: 所屬包(一個(gè)包就是一個(gè)apk)
enabled: 是否可用
clickable: 是否可點(diǎn)擊
focused: 是否聚焦?fàn)顟B(tài)
bounds: 坐標(biāo)
Adb命令基礎(chǔ)
Andorid sdk介紹
- add-ons: 附加庫
- build-tools: 編譯工具
- platform: 各版本sdk
- platforms-tools: 平臺(tái)通用工具, 如adb
- tools: 常用工具
Adb介紹
Adb(Android Debug Bridge): Andoid設(shè)備調(diào)試橋梁, 可以再PC端通過命令調(diào)試Android設(shè)備, 如獲取設(shè)備狀態(tài), 安裝/卸載app, 上傳/下載文件等操作
Adb常用命令
開啟/關(guān)閉服務(wù)
- adb start-server: 開啟服務(wù)
- adb kill-server: 關(guān)閉服務(wù)
連接設(shè)備/獲取連接狀態(tài)(自動(dòng)開啟服務(wù))
- adb connect/disconnect 設(shè)備名或uuid: 連接/斷開連接設(shè)備
- adb devices: 查看連接的設(shè)備
安裝/卸載app
- adb install 安裝包路徑.apk
- adb uninstall apk包名
通過uiautomatorviewer可以獲取獲取apk包名
上傳/下載文件
- 上傳: adb push 本地文件 設(shè)備目錄
- 下載: adb pull 設(shè)備文件 本地目錄
adb push 1.txt /sdcard/
adb pull sdcard/1.txt .
adb shell: 可用于查看設(shè)備中的文件, exit退出
強(qiáng)大的adb shell
- pm: 應(yīng)用及權(quán)限管理
adb shell pm list packages
- am: Activity操作
adb shell am start -n 包名/包名.主Activity名
- input: 模擬按鍵/輸入
- 點(diǎn)擊(觸控)指定坐標(biāo):
adb shell input tap 50 250
- 輸入文字:
adb shell input text hello
- 按鍵:
adb shell input keyevent 3
- 滑動(dòng):
adb shell input swipe 300 1000 300 500
- 點(diǎn)擊(觸控)指定坐標(biāo):
- logcat: 日志查看及過濾(問題定位)
- monkey: 性能/穩(wěn)定性測(cè)試
- dumpsys: 性能分析
- screencap: 截圖
adb shell screencap -p /sdcard/01.png
- screenrecord: 錄屏
adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
使用aapt獲取包名, 主Activity(aapt位于Androidsdk/build-tools下)
aapt dump badging app-debug.apk
package: name='com.lqr.wechat'
...
launchable-activity: name='com.lqr.wechat.ui.activity.SplashActivity'
...
name中包含 包名.主Acitivty名
示例:
配合uiautomatorviewer查看元素坐標(biāo), 使用bounds中x,y的平均值, 屏幕分辨率1280*760, 滑動(dòng)時(shí)可取平均值
- 安裝高仿微信app
- 啟動(dòng)app
- 點(diǎn)擊登錄按鈕
- 輸入18010181267
- 按TAB鍵
- 輸入123456
adb install app-debug.apk
adb am start -n com.lqr.wechat/com.lqr.wechat.com.lqr.wechat.ui.activity.SplashActivity
adb shell input tap 170 1197
adb shell input text 18010181267
adb shell input keyevent KEYCODE_TAB
adb adb shell input tap 360 498
adb shell input swipe 700 540 10 540 # 滑動(dòng)時(shí)離開一定邊界
adb shell screencap -p /sdcard/01.png
adb shell input keyevent 3 # 按HOME鍵
adb pull /sdcard/01.png . # 下載圖片
支持的KEYCODE
- 0 --> "KEYCODE_UNKNOWN"
- 1 --> "KEYCODE_MENU"
- 2 --> "KEYCODE_SOFT_RIGHT"
- 3 --> "KEYCODE_HOME"
- 4 --> "KEYCODE_BACK"
- 5 --> "KEYCODE_CALL"
- 6 --> "KEYCODE_ENDCALL"
- 7 --> "KEYCODE_0"
- 8 --> "KEYCODE_1"
- 9 --> "KEYCODE_2"
- 10 --> "KEYCODE_3"
- 11 --> "KEYCODE_4"
- 12 --> "KEYCODE_5"
- 13 --> "KEYCODE_6"
- 14 --> "KEYCODE_7"
- 15 --> "KEYCODE_8"
- 16 --> "KEYCODE_9"
- 17 --> "KEYCODE_STAR"
- 18 --> "KEYCODE_POUND"
- 19 --> "KEYCODE_DPAD_UP"
- 20 --> "KEYCODE_DPAD_DOWN"
- 21 --> "KEYCODE_DPAD_LEFT"
- 22 --> "KEYCODE_DPAD_RIGHT"
- 23 --> "KEYCODE_DPAD_CENTER"
- 24 --> "KEYCODE_VOLUME_UP"
- 25 --> "KEYCODE_VOLUME_DOWN"
- 26 --> "KEYCODE_POWER"
- 27 --> "KEYCODE_CAMERA"
- 28 --> "KEYCODE_CLEAR"
- 29 --> "KEYCODE_A"
- 30 --> "KEYCODE_B"
- 31 --> "KEYCODE_C"
- 32 --> "KEYCODE_D"
- 33 --> "KEYCODE_E"
- 34 --> "KEYCODE_F"
- 35 --> "KEYCODE_G"
- 36 --> "KEYCODE_H"
- 37 --> "KEYCODE_I"
- 38 --> "KEYCODE_J"
- 39 --> "KEYCODE_K"
- 40 --> "KEYCODE_L"
- 41 --> "KEYCODE_M"
- 42 --> "KEYCODE_N"
- 43 --> "KEYCODE_O"
- 44 --> "KEYCODE_P"
- 45 --> "KEYCODE_Q"
- 46 --> "KEYCODE_R"
- 47 --> "KEYCODE_S"
- 48 --> "KEYCODE_T"
- 49 --> "KEYCODE_U"
- 50 --> "KEYCODE_V"
- 51 --> "KEYCODE_W"
- 52 --> "KEYCODE_X"
- 53 --> "KEYCODE_Y"
- 54 --> "KEYCODE_Z"
- 55 --> "KEYCODE_COMMA"
- 56 --> "KEYCODE_PERIOD"
- 57 --> "KEYCODE_ALT_LEFT"
- 58 --> "KEYCODE_ALT_RIGHT"
- 59 --> "KEYCODE_SHIFT_LEFT"
- 60 --> "KEYCODE_SHIFT_RIGHT"
- 61 --> "KEYCODE_TAB"
- 62 --> "KEYCODE_SPACE"
- 63 --> "KEYCODE_SYM"
- 64 --> "KEYCODE_EXPLORER"
- 65 --> "KEYCODE_ENVELOPE"
- 66 --> "KEYCODE_ENTER"
- 67 --> "KEYCODE_DEL"
- 68 --> "KEYCODE_GRAVE"
- 69 --> "KEYCODE_MINUS"
- 70 --> "KEYCODE_EQUALS"
- 71 --> "KEYCODE_LEFT_BRACKET"
- 72 --> "KEYCODE_RIGHT_BRACKET"
- 73 --> "KEYCODE_BACKSLASH"
- 74 --> "KEYCODE_SEMICOLON"
- 75 --> "KEYCODE_APOSTROPHE"
- 76 --> "KEYCODE_SLASH"
- 77 --> "KEYCODE_AT"
- 78 --> "KEYCODE_NUM"
- 79 --> "KEYCODE_HEADSETHOOK"
- 80 --> "KEYCODE_FOCUS"
- 81 --> "KEYCODE_PLUS"
- 82 --> "KEYCODE_MENU"
- 83 --> "KEYCODE_NOTIFICATION"
- 84 --> "KEYCODE_SEARCH"
- 85 --> "TAG_LAST_KEYCODE"
Appium使用
獲取app的Package和Activity
desired_caps
元素定位
uiautoviewer
- id: resource_id
- name: text/content-desc
- xpath: