Appium基礎(chǔ)教程

[TOC]

Appium教程

Appium簡(jiǎn)介

Appium是一款開源的Appium自動(dòng)化工具, 基于Webdriver協(xié)議, 主要有以下3個(gè)特點(diǎn):

  1. 全能: 支持iOS/Andorid/H5/混合App/WinApp
  2. 通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各種語言
  3. 開源: 免費(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)

image

  1. 調(diào)用Android adb完成基本的系統(tǒng)操作
  2. 向Android上部署bootstrap.jar
  3. bootstrap.jar Forward Android的端口到PC機(jī)器上
  4. PC上監(jiān)聽端口接收請(qǐng)求咒程,使用webdriver協(xié)議
  5. 分析命令并通過forward 端口發(fā)給bootstrap.jar
  6. bootstrap.jar接收請(qǐng)求并把命令發(fā)給uiautomator
  7. ui automator執(zhí)行命令

Andorid-uiautomator2-driver: bootstrap.jar改為使用uiautomato2 server apk, 使用netty server代替原來的websocket與PC端通信

iOS

  1. client端 依然是 test script是我們的webdriver測(cè)試腳本蚤霞。
  2. 中間是起的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)操作。
  3. 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)行交互
  4. 最后Bootstrap.js將執(zhí)行的結(jié)果返回給appium server
  5. 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
  • 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:
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饼记,一起剝皮案震驚了整個(gè)濱河市香伴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌具则,老刑警劉巖即纲,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異博肋,居然都是意外死亡低斋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門匪凡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膊畴,“玉大人,你說我怎么就攤上這事锹雏“捅龋” “怎么了术奖?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵礁遵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我采记,道長(zhǎng)佣耐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任唧龄,我火速辦了婚禮兼砖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己讽挟,他們只是感情好懒叛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耽梅,像睡著了一般薛窥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眼姐,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天诅迷,我揣著相機(jī)與錄音,去河邊找鬼众旗。 笑死罢杉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贡歧。 我是一名探鬼主播滩租,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼利朵!你這毒婦竟也來了持际?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤哗咆,失蹤者是張志新(化名)和其女友劉穎蜘欲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晌柬,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姥份,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了年碘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澈歉。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屿衅,靈堂內(nèi)的尸體忽然破棺而出埃难,到底是詐尸還是另有隱情,我是刑警寧澤涤久,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布涡尘,位于F島的核電站,受9級(jí)特大地震影響响迂,放射性物質(zhì)發(fā)生泄漏考抄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一蔗彤、第九天 我趴在偏房一處隱蔽的房頂上張望川梅。 院中可真熱鬧疯兼,春花似錦、人聲如沸贫途。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丢早。三九已至来氧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間香拉,已是汗流浹背啦扬。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凫碌,地道東北人扑毡。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盛险,于是被迫代替她去往敵國(guó)和親瞄摊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容