1. 程式人生 > 實用技巧 >史上最全 Appium 自動化測試從基礎到框架實戰精華學習筆記(一)

史上最全 Appium 自動化測試從基礎到框架實戰精華學習筆記(一)

本文為霍格沃茲測試學院學員學習筆記。

對測試人來說,Appium 是非常重要的一個開源跨平臺自動化測試工具,它允許測試人員在不同的平臺(iOS、Android 等)使用同一套 API 來寫自動化測試指令碼,這樣可大幅提升程式碼複用率和工作效率。

本文彙總了從 Appium 基礎到自動化測試高階實戰中,所涉及到的方方面面的知識點精華內容(如下所示),希望對大家快速總結和複習有所幫助。

Appium 從基礎到自動化測試框架實戰

  1. Appium 基礎 1(環境搭建和簡介)
  2. Appium 基礎 2(元素定位和元素常用方法)
  3. Appium 基礎 3(手勢操作和 uiautomator 查詢元素)
  4. Appium 基礎 4(顯式等待)
  5. Appium 基礎 5(toast 和引數化)
  6. Appium 基礎 6(webview)
  7. Appium_ 企業微信練習 (非 PO,增加和刪除聯絡人)
  8. 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

  1. 開啟雪球 app
  2. 點選搜尋輸入框
  3. 向搜尋輸入框輸入 “阿里巴巴”
  4. 在搜尋的結果裡選擇阿里巴巴,然後點選
  5. 獲取這隻上香港 阿里巴巴的股價,並判斷這隻股價的價格>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

  1. 開啟雪球首頁
  2. 定位首頁的搜尋框
  3. 判斷搜尋框是否可用,並檢視搜尋框 name 屬性值
  4. 列印搜尋框這個元素的左上角座標和它的寬高
  5. 向搜尋框輸入:alibaba
  6. 判斷阿里巴巴是否可見
  7. 如果可見,列印搜尋成功點選,如果不可見,列印搜尋失敗
程式碼
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("搜尋失敗")

更多內容,我們在後續文章分享。

想觀看更多內容,可關注公眾號:霍格沃茲測試學院