史上最全 Appium 自動化測試從基礎到框架實戰精華學習筆記(一)
阿新 • • 發佈:2020-07-13
本文為霍格沃茲測試學院學員學習筆記。
對測試人來說,Appium 是非常重要的一個開源跨平臺自動化測試工具,它允許測試人員在不同的平臺(iOS、Android 等)使用同一套 API 來寫自動化測試指令碼,這樣可大幅提升程式碼複用率和工作效率。
本文彙總了從 Appium 基礎到自動化測試高階實戰中,所涉及到的方方面面的知識點精華內容(如下所示),希望對大家快速總結和複習有所幫助。
Appium 從基礎到自動化測試框架實戰
- Appium 基礎 1(環境搭建和簡介)
- Appium 基礎 2(元素定位和元素常用方法)
- Appium 基礎 3(手勢操作和 uiautomator 查詢元素)
- Appium 基礎 4(顯式等待)
- Appium 基礎 5(toast 和引數化)
- Appium 基礎 6(webview)
- Appium_ 企業微信練習 (非 PO,增加和刪除聯絡人)
- Appium_ 企業微信練習 (PO--增加聯絡人)
Appium 環境搭建
JDK 的搭建
- 下載 1.8 的 jdk
- 新建環境變數:JAVA_HOME 值為:D:\Program Files\Java\jdk1.7.0
- 新建環境變數:CLASSPATH 值為:.;%JAVA_HOME%\lib;(注意:點號表示當前目錄,不能省略)
- 在系統變數 Path 的值的前面加入以下內容:%JAVA_HOME%\bin
SDK 的配置
- 下載 sdk
- 開啟 sdk 的 sdk manager,安裝 tools 前 3 個東西和 google 的 usb 驅動
- 配置 Android home 裡面的 platform-tools 和 tools
Appium 的搭建
- 安裝 node.js,配置 node.js 的環境變數
- npm install -g cnpm --registry=https://registry.npm.taobao.org
- cnpm install -g appium
- cnpm install -g appium-doctor
- pip install appium-python-client
appium 執行的 python 程式碼
- mumu 連線 adb 是:adb connect 127.0.0.1:7555
fromappiumimportwebdriver
#設定caps的值
desire_cap={
#預設是Android
"platformName":"android",
#adbdevices的sn名稱
"deviceName":"127.0.0.1:7555",
#包名
"appPackage":"com.xueqiu.android",
#activity名字
"appActivity":".view.WelcomeActivityAlias"
}
#執行appium,前提是要開啟appiumserver
driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",desire_cap)
Appium 的簡介
Appium 的引擎
- Android 是 uiautomator2
- ios 是 xcuitest
Appium 的設計理念
- webdriver 是基於 http 協議的,第一連線會建立一個 session 會話,並通過 post 傳送一個 json 告知服務端相關測試資訊
- client/server 設計模式
- 客戶端通過 webdriver json wire 協議與伺服器通訊
- 多語言支援
- server 可以放在任何地方
- 伺服器 nodejs 開發的 http 服務
- appium 使用 appium-xcuitest-driver 來測試 iphone 裝置,其中需要安裝 Facebook 出的 WDA(webdriver agent) 來驅動 ios 測試
Appium 的生態工具
- adb:Android 控制工具
- appium Destkop:內嵌 appium server 和 inspector 的綜合工具
- appium server:appium 的核心工具,命令列工具
- appium client:各種語言的客戶端封裝庫,使用者連線 appium server,包含 python、java、ruby 等
- appcrawler 自動遍歷工具
獲取 App 的資訊
- 獲取當前元素介面:adb shell dumpsys activity top
- 獲取任務列表:adb shell dumpsys activity activities
- 獲取 app 的 package 和 activity:adb shell;然後 logcat | grep -i displayed
- 啟動應用:adb shell am start -W -n "com.xueqiu.android/.view.WelcomeActivityAlias -S
Capability 設定
- 文件地址:http://appium.io/docs/en/writing-running-appium/caps/index.html
- platformName:android 通常都是寫 android
- deviceName:127.0.0.1:7555 這個通常是 adb devices 的名稱
- appPackage:com.xueqiu.android 這個是 app 的 package 包名
- appActivity:.view.WelcomeActivityAlias 這個是 app 的 activity 名
- noReset:true, false 是否重置測試的環境(例如首次開啟彈框,或者登陸資訊)
- unicodeKeyboard:true, false 是否需要輸入非英文之外的語言並在測試完成後重置輸入法,比如輸入中文
- dontStopAppOnReset:true, false 首次啟動的時候,不停止 app
- skipDeviceInitialization:true, false 跳過安裝,許可權設定等操作
測試用的 apk
- https://github.com/appium/appium/tree/master/sample-code/apps
Android 的基礎知識
Android 的佈局
- Android 是通過容器的佈局屬性來管理子控制元件的位置關係,佈局過程就是把介面上的所有的控制元件,根據他們的間距的大小,擺放在正確的位置
- 線性佈局:LinearLayout
- 相對佈局:RelativeLayout
- 幀佈局:FrameLayout
- 絕對佈局:AbsoluteLayout
- 表格佈局:TableLayout
- 網格佈局:GirdLayout
- 約束佈局:ConstraintLayout
Android 四大元件
- activity:與使用者互動的視覺化介面
- service:實現程式後臺執行的解決方案,比如 qq 音樂的音樂在後臺執行,沒有介面
- content provide:內容提供者,提供程式所需要的資料,比如?提供資料庫?
- broadcast receiver:廣播接收器,監聽外部事件的到來(比如來電)
Android 常用的控制元件
- TextView:文字控制元件
- EditText:可編輯文字控制元件
- Button:按鈕
- ImageButton:圖示按鈕
- ToggleButton:開關按鈕
- ImageView:圖片控制元件
- CheckBox:複選框控制元件
- RadioButton:單選框控制元件
控制元件知識
- dom:Document Object Model 文件物件模型
- dom 應用:最早應用於 html 和 js 的互動,使用者表示界的控制元件層級,介面的結構化描述,常見的格式為 html、xml。核心元素為節點和屬性
- xpath:xml 路徑語言,用於 xml 中的節點定位
- Android 的應用層級結構是定製的 xml
- app source 類似於 dom,表示 app 的層級,表示介面裡面所有的控制元件數的結構
- 每個控制元件都有它的屬性(resourceid、xpath、aid),沒有 css 屬性
Appium 的元素定位
普通方式的定位
- driver.find_element_by_accessibility_id() 對應 content-desc
- driver.find_element_by_id() 對應 resource-id
- driver.find_element_by_name() 對應 text
- driver.find_element_by_xpath() 對應 xpath
By 的定位方式
- 首先要 from appium.webdriver.common.mobileby import MobileBy as By
- self.driver.find_element(By.ID,"") 對應 resource-id
- self.driver.find_element(By.XPATH,"") 對應 xpath
- self.driver.find_element(By.ACCESSIBILITY_ID,"") 對應 content-desc
- self.driver.find_element(By.NAME,"") 對應 text
Xpath 的定位方式
- driver.find_element_by_xpath("//*[@text=' 掃一掃 ']")
- driver.find_element_by_xpath("//*[@resource-id='com.taobao.taobao:id/tv_scan_text']")
- driver.find_element_by_xpath("//*[@content-desc=' 幫助 ']")
- driver.find_element(By.XPATH,"//*[@resource-id='com.xueqiu.android:id/name' and @text=' 阿里巴巴 ']") and 的使用
- 父類和兄弟類的方法://[@text=' 性別 ']/..//[@text=' 男 ']。其中 /.. 表示父類,//* 就是兄弟,孫子等類
- //*[Contains(@text,"tong")] 這是 xpath 的 text 模糊搜尋的方法
元素的方法
元素的常用方法
- 點選方法:element.click()
- 輸入操作:element.send_keys("tong")
- 設定元素的值:element.set_value("tongtong")
- 清除操作:element.clear()
- 是否可見:element.is_displayed 返回 true or false
- 是否可用:element.enabled() 返回 true or false
- 是否被選中:element.is_selected() 返回 true or false
- 獲取屬性值:element.get_attribute(name)
屬性值介紹
- get_attribute(name) 獲取的屬性名稱和 uiautomatorviewer 的一致,但是 index 的值獲取不了
- 真假獲取的值是 true 和 false 的字串,並不是 python 的 boolean 值
元素常用的屬性
- 獲取元素文字:element.text
- 獲取元素座標:element.location
- 結果:{'y':19,'x':498}
- 獲取元素尺寸(高和寬):element.size
- 結果:{'width':500,'height':22}
實戰小案例 1
- 開啟雪球 app
- 點選搜尋輸入框
- 向搜尋輸入框輸入 “阿里巴巴”
- 在搜尋的結果裡選擇阿里巴巴,然後點選
- 獲取這隻上香港 阿里巴巴的股價,並判斷這隻股價的價格>200
程式碼
fromtimeimportsleep
fromappiumimportwebdriver
fromappium.webdriver.common.mobilebyimportMobileByasBy
classTestFind():
#設定caps的值
defsetup(self):
self.desire_cap={
#預設是Android
"platformName":"android",
#adbdevices的sn名稱
"deviceName":"127.0.0.1:7555",
#包名
"appPackage":"com.xueqiu.android",
#activity名字
"appActivity":".view.WelcomeActivityAlias",
"noReset":"true",
"unicodeKeyboard":True
}
#執行appium,前提是要開啟appiumserver
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
deftest_search(self):
"""
1.開啟雪球app
2.點選搜尋輸入框
3.向搜尋輸入框輸入“阿里巴巴”
4.在搜尋的結果裡選擇阿里巴巴,然後點選
5.獲取這隻上香港阿里巴巴的股價,並判斷這隻股價的價格>200
:return:
"""
sleep(3)
#點選搜尋框
self.driver.find_element(By.ID,"com.xueqiu.android:id/tv_search").click()
#向搜尋框輸入阿里巴巴
self.driver.find_element(By.ID,"com.xueqiu.android:id/search_input_text").send_keys("阿里巴巴")
#找到搜尋框預覽結果的阿里巴巴,並點選
self.driver.find_element(By.XPATH,"//*[@resource-id='com.xueqiu.android:id/name'and@text='阿里巴巴']").click()
#選擇HK股價的元素
prices=self.driver.find_elements(By.ID,"com.xueqiu.android:id/current_price")[1]
#提取股價的text屬性
price=float(prices.text)
#判斷股價是否大於200
assertprice>200
實戰小案例 2
- 開啟雪球首頁
- 定位首頁的搜尋框
- 判斷搜尋框是否可用,並檢視搜尋框 name 屬性值
- 列印搜尋框這個元素的左上角座標和它的寬高
- 向搜尋框輸入:alibaba
- 判斷阿里巴巴是否可見
- 如果可見,列印搜尋成功點選,如果不可見,列印搜尋失敗
程式碼
fromtimeimportsleep
fromappiumimportwebdriver
fromappium.webdriver.common.mobilebyimportMobileByasBy
classTestFind():
#設定caps的值
defsetup(self):
self.desire_cap={
#預設是Android
"platformName":"android",
#adbdevices的sn名稱
"deviceName":"127.0.0.1:7555",
#包名
"appPackage":"com.xueqiu.android",
#activity名字
"appActivity":".view.WelcomeActivityAlias",
"noReset":"true",
"unicodeKeyboard":True
}
#執行appium,前提是要開啟appiumserver
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
deftest_element_function(self):
"""
1.開啟雪球首頁
2.定位首頁的搜尋框
3.判斷搜尋框是否可用,並檢視搜尋框name屬性值
4.列印搜尋框這個元素的左上角座標和它的寬高
5. 向搜尋框輸入:alibaba
6.判斷阿里巴巴是否可見
7.如果可見,列印搜尋成功點選,如果不可見,列印搜尋失敗
:return:
"""
sleep(8)
#找到搜尋框的元素
search=self.driver.find_element(By.ID,"com.xueqiu.android:id/tv_search")
#當搜尋框是可用(類似可點選)後才進行下面的操作,is_enabled()返回TureorFalse
ifsearch.is_enabled():
#列印搜尋框的text值
print(search.text)
#列印搜尋框左上角的座標
print(search.location)
#列印搜尋框的高和寬
print(search.size)
#點選搜尋框,才可以進行下面的操作
search.click()
#在搜尋框中輸入阿里巴巴
self.driver.find_element(By.ID,"com.xueqiu.android:id/search_input_text").send_keys("阿里巴巴")
#定義找到預覽結果的阿里巴巴的元素
alibaba=self.driver.find_element(By.XPATH,"//*[@resource-id='com.xueqiu.android:id/name'and@text='阿里巴巴']")
#當alibaba元素可見,開啟搜尋成功,否則列印搜尋失敗
ifalibaba.is_displayed():
print("搜尋成功")
else:
print("搜尋失敗")
更多內容,我們在後續文章分享。
想觀看更多內容,可關注公眾號:霍格沃茲測試學院