[TOC]python
Appium教程
Appium簡介
Appium是一款開源的Appium自動化工具, 基於Webdriver協議, 主要有如下3個特色:web
- 全能: 支持iOS/Andorid/H5/混合App/WinApp
- 通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各類語言
- 開源: 免費
App自動化測試工具對比
iOSshell
官方:bootstrap
- Uiautomation/XCUITest: 白盒, UI測試, JS 其餘:
- FastMonkey: 性能(仿Monkey), 張釗
Andoridbash
官方:微信
- Uiautomator/Uiautomtor2: UI測試, Java
- Monkey: app性能/穩定性測試, 隨機操做
- MonkeyRunner: UI測試, Jpython, 只能經過座標定位
- Robotium: 白盒, UI測試, Java, 支持Webview/Toast/menu/Dialog等, 沒法跨進程
- Espresso: 官方推薦擴展測試包, 白盒,ui, 通常開發自測使用
- CTS: 兼容性測試, Java
其餘:websocket
- Python-Uiautomotor2: UI測試, 使用簡單, 支持無線鏈接設備及使用weditor查看元素定位
- Adb-For-Test/adb-For-Robotium: 我的, 基於adb命令的封裝
多平臺支持架構
- Calabash: iOS/Andriod/混合app, Ruby, BDD模式, Api豐富
- Appium: iOS/Andriod/混合app/H5, Java/Python/Ruby/JS..
- Macaco: 阿里基於Appium進行的精簡封裝的一套框架, 支持Electron應用, 包含app-inspector和ui-recorder, 統一了iOS/Android操做的Api, 目前坑比較多, 環境搭建較麻煩
- Airtest(ATS): 網易推出的一款基於截圖對比的App自動化測試工具, 可用於App遊戲UI測試, 支持iOS/Android
雲平臺app
- Sauce Labs: Appium官方推薦, 應用最廣的雲測平臺, 收費
- Testin/騰訊雲測等: 國內雲平臺, 收費
- OpenSTF: 開源手機集羣管理平臺, 免費
Appium實現原理
Andorid(uiautomator) 框架
- 調用Android adb完成基本的系統操做
- 向Android上部署bootstrap.jar
- bootstrap.jar Forward Android的端口到PC機器上
- PC上監聽端口接收請求,使用webdriver協議
- 分析命令並經過forward 端口發給bootstrap.jar
- bootstrap.jar接收請求並把命令發給uiautomator
- ui automator執行命令
Andorid-uiautomator2-driver: bootstrap.jar改成使用uiautomato2 server apk, 使用netty server代替原來的websocket與PC端通訊
iOS
- client端 依然是 test script是咱們的webdriver測試腳本。
- 中間是起的Appium的服務,Appium在服務端起了一個Server(4723端口),跟selenium Webdriver測試框架相似, Appium⽀持標準的WebDriver JSONWireProtocol。在這裏提供它提供了一套REST的接口,Appium Server接收web driver client標準rest請求,解析請求內容,調⽤用對應的框架響應操做。
- appium server調用instruments.js 啓動⼀一個socket server,同時分出一個⼦子進程運⾏instruments.app,將bootstrap.js(一個UIAutomation腳本)注⼊入到device⽤於和外界進行交互
- 最後Bootstrap.js將執行的結果返回給appium server
- appium server再將結果返回給 appium client。
環境搭建
- 安裝JDK, 配置環境變量
- 安裝Android SDK, 配置環境變量
- 安裝Appium-Windows-Desktop
- 安裝Appium-Python-Client
- 安裝模擬器
Mac Android/iOS環境搭建
Andorid介紹
基本架構
常見佈局/視圖
- 線性佈局: LinerLayout
- 相對佈局: RelativeLayout
- 幀佈局: FrameLayout, 疊放
- 普通視圖: View
- 切換視圖: ListView, 注意, 其中的元素會動態變化
HierarchyViewer, uiautomatorviewer
基本控件
- TextView: 文本
- Button: 按鈕
- EditText: 輸入框
- ImageView: 圖片
- 其餘: Alert(警告框)/Toast(提示消息)/SeekBar(滑塊)/Webview(嵌入網頁)
控件常見屬性
-
index: 索引, 用於排序
-
text: 控件名稱(顯示文本)
-
resource-id: 資源id
-
class: 控件類型(文本/按鈕/輸入框等)
-
content-desc: 控件描述
-
package: 所屬包(一個包就是一個apk)
-
enabled: 是否可用
-
clickable: 是否可點擊
-
focused: 是否聚焦狀態
-
bounds: 座標
Adb命令基礎
Andorid sdk介紹
- add-ons: 附加庫
- build-tools: 編譯工具
- platform: 各版本sdk
- platforms-tools: 平臺通用工具, 如adb
- tools: 經常使用工具
Adb介紹
Adb(Android Debug Bridge): Andoid設備調試橋樑, 能夠再PC端經過命令調試Android設備, 如獲取設備狀態, 安裝/卸載app, 上傳/下載文件等操做
Adb經常使用命令
開啓/關閉服務
- adb start-server: 開啓服務
- adb kill-server: 關閉服務
鏈接設備/獲取鏈接狀態(自動開啓服務)
- adb connect/disconnect 設備名或uuid: 鏈接/斷開鏈接設備
- adb devices: 查看鏈接的設備
安裝/卸載app
- adb install 安裝包路徑.apk
- adb uninstall apk包名
經過uiautomatorviewer能夠獲取獲取apk包名
上傳/下載文件
- 上傳: adb push 本地文件 設備目錄
- 下載: adb pull 設備文件 本地目錄
adb push 1.txt /sdcard/
adb pull sdcard/1.txt .
adb shell: 可用於查看設備中的文件, exit退出
強大的adb shell
- pm: 應用及權限管理
adb shell pm list packages
- am: Activity操做
adb shell am start -n 包名/包名.主Activity名
- input: 模擬按鍵/輸入
- 點擊(觸控)指定座標:
adb shell input tap 50 250
- 輸入文字:
adb shell input text hello
- 按鍵:
adb shell input keyevent 3
- 滑動:
adb shell input swipe 300 1000 300 500
- logcat: 日誌查看及過濾(問題定位)
- monkey: 性能/穩定性測試
- 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查看元素座標, 使用bounds中x,y的平均值, 屏幕分辨率1280*760, 滑動時可取平均值
- 安裝高仿微信app
- 啓動app
- 點擊登陸按鈕
- 輸入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 # 滑動時離開必定邊界
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: