一、Appium介紹
Appium是一個(gè)移動(dòng)端的自動(dòng)化框架掌挚,可用于測(cè)試原生應(yīng)用砰诵、移動(dòng)網(wǎng)頁(yè)應(yīng)用和混合型應(yīng)用征唬,且是跨平臺(tái)的∽屡恚可用于IOS和Android以及firefox的操作系統(tǒng)鳍鸵。
原生的應(yīng)用是指用android或ios的sdk編寫的應(yīng)用;移動(dòng)網(wǎng)頁(yè)應(yīng)用是指網(wǎng)頁(yè)應(yīng)用尉间,類似于ios中safari應(yīng)用或者Chrome應(yīng)用或者類瀏覽器的應(yīng)用偿乖;混合應(yīng)用是指一種包裹webview的應(yīng)用,原生應(yīng)用于網(wǎng)頁(yè)內(nèi)容交互性的應(yīng)用。
重要的是Appium是跨平臺(tái)的哲嘲,何為跨平臺(tái)贪薪,意思就是可以針對(duì)不同的平臺(tái)用一套api來(lái)編寫測(cè)試用例。
二眠副、環(huán)境搭建
主要幾個(gè)點(diǎn)如下:
1. appium安裝
直接解壓即可画切,打開(kāi)Appium.exe
啟動(dòng)成功展示如下:
2. Appium庫(kù)安裝
安裝
pip install Appium-Python-Client
檢驗(yàn)是否成功
pip list
三、Appium使用
1. 打開(kāi)模擬器或真機(jī)的應(yīng)用
①打開(kāi)手機(jī)應(yīng)用
②打開(kāi)Appium
③創(chuàng)建一個(gè)python項(xiàng)目囱怕,并創(chuàng)建一個(gè)文件
④將下面代碼復(fù)制到文件中
⑤獲取當(dāng)前應(yīng)用包名和啟動(dòng)activity并修改文件
from appium import webdriver
server 啟動(dòng)參數(shù)
desired_caps = dict()
設(shè)備信息
平臺(tái)信息霍弹,不區(qū)分大小寫
desired_caps['platformName'] = 'Android'
系統(tǒng)版本,7.1.2可以寫[7 娃弓,7.1 典格, 7.1.2]
desired_caps['platformVersion'] = '7.1.2'
設(shè)備名稱,可以隨便寫台丛,但是不能亂寫耍缴,Android可以隨便寫,但是ios必須正確的寫
desired_caps['deviceName'] = 'emulator-5554'
app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
聲明我們的driver對(duì)象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
driver.quit()
2. 腳本內(nèi)啟動(dòng)其他app
driver.start_activity(appPackage,appActivity)
3. 關(guān)閉app
driver.close_app() # 關(guān)閉當(dāng)前操作的app,不會(huì)關(guān)閉驅(qū)動(dòng)對(duì)象
4. 關(guān)閉驅(qū)動(dòng)對(duì)象
driver.quit() # 關(guān)閉驅(qū)動(dòng)對(duì)象防嗡,同時(shí)關(guān)閉所有關(guān)聯(lián)的app
三变汪、App基礎(chǔ)操作API
完成app自動(dòng)化需要一些基礎(chǔ)條件的支持,本節(jié)將講解APP初始化API蚁趁。
3.1前置代碼
server 啟動(dòng)參數(shù)
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
聲明driver對(duì)象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
3.2 安裝APK到手機(jī)
driver.install_app(app_path)
參數(shù):app_path:腳本機(jī)器中APK文件路徑
3.3 手機(jī)中移除APP
driver.remove_app(app_id)
參數(shù):app_id:需要卸載的app包名
3.4 判斷APP是否已安裝
driver.is_app_installed(bundle_id)
參數(shù):bundle_id: 可以傳入app包名,返回結(jié)果為True(已安裝) / False(未安裝)
3.5 發(fā)送文件到手機(jī)
import base64
data = str(base64.b64encode(data.encode('utf-8')),'utf-8')
driver.push_file(path,data)
參數(shù):
path:手機(jī)設(shè)備上的路徑(例如:/sdcard/a.txt)
data:文件內(nèi)數(shù)據(jù),要求base64編碼
Python3.x中字符都為unicode編碼裙盾,而b64encode函數(shù)的參數(shù)為byte類型,需要先轉(zhuǎn)碼他嫡;
生成的數(shù)據(jù)為byte類型闷煤,需要將byte轉(zhuǎn)換回去。
3.6 從手機(jī)中拉取文件
import base64
data = driver.pull_file(path) # 返回?cái)?shù)據(jù)為base64編碼
print(str(base64.b64decode(data),'utf-8')) # base64解碼
參數(shù): path: 手機(jī)設(shè)備上的路徑
3.7獲取當(dāng)前屏幕內(nèi)元素結(jié)構(gòu)
driver.page_source
作用:返回當(dāng)前頁(yè)面的文檔結(jié)構(gòu)涮瞻,判斷特定的元素是否存在
四鲤拿、手機(jī)控件查看工具uiautomatorviewer
4.1 工具簡(jiǎn)介
用來(lái)掃描和分析Android應(yīng)用程序的UI控件的工具.
4.1 如何使用
- 進(jìn)入SDK目錄下的tools目錄,打開(kāi)uiautomatorviewer
- 電腦連接真機(jī)或打開(kāi)android模擬器
- 啟動(dòng)待測(cè)試app
- 點(diǎn)擊uiautomatorviewer的左上角Device Screenshot,會(huì)生成app當(dāng)前頁(yè)面的UI控件截圖
- 選擇截圖上需要查看的控件署咽,即可瀏覽該控件的id,class,text,坐標(biāo)等信息
五近顷、APP元素定位操作
手工測(cè)試主要通過(guò)可見(jiàn)按鈕操作,而自動(dòng)化是通過(guò)元素進(jìn)行交互操作宁否。
元素的基本定位基于當(dāng)前屏幕范圍內(nèi)展示的可見(jiàn)元素窒升。
5.1 Appium常用元素定位方式
| name | value |
| --- | --- |
| id | id屬性值 |
| class | class屬性值 |
| xpath | xpath表達(dá)式 |
5.2 前置代碼
from appium import webdriver
server 啟動(dòng)參數(shù)
desired_caps = {}
設(shè)備信息
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
聲明我們的driver對(duì)象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
5.3 通過(guò)id定位
- 方法:find_element_by_id(id_value) # id_value:為元素的id屬性值
- 業(yè)務(wù)場(chǎng)景:
1. 進(jìn)入設(shè)置頁(yè)面
2. 通過(guò)ID定位方式點(diǎn)擊搜索按鈕 - 代碼實(shí)現(xiàn):
driver.find_element_by_id("com.android.settings:id/search").click()
driver.quit()
5.4 通過(guò)class定位 - 方法:find_element_by_class_name(class_value) # class_value:為元素的class屬性值
- 業(yè)務(wù)場(chǎng)景:
1. 進(jìn)入設(shè)置頁(yè)面
2. 點(diǎn)擊搜索按鈕
3. 通過(guò)class定位方式點(diǎn)擊輸入框的返回按鈕 - 代碼實(shí)現(xiàn):
id 點(diǎn)擊搜索按鈕
driver.find_element_by_id("com.android.settings:id/search").click()
class 點(diǎn)擊輸入框返回按鈕
driver.find_element_by_class_name('android.widget.ImageButton').click()
driver.quit()
5.5 通過(guò)xpath定位
-
方法:find_element_by_xpath(xpath_value) # xpath_value:為可以定位到元素的xpath語(yǔ)句
android端xptah常用屬性定位:- id ://*contains(@resource-id,'[com.android.settings:id/search')]
- class ://*[contains(@class,'android.widget.ImageButton')]
- text ://*[contains(@text,'WLA')]
模糊定位 contains(@key,value): value可以是部分值
業(yè)務(wù)場(chǎng)景:
1. 進(jìn)入設(shè)置頁(yè)面
2. 點(diǎn)擊WLAN菜單欄-
代碼實(shí)現(xiàn):
xpath 點(diǎn)擊WLAN按鈕
driver.find_element_by_xpath("http://*[contains(@text,'WLA')]").click()
5.6 定位一組元素,注意element -> elements
應(yīng)用場(chǎng)景為元素值重復(fù),無(wú)法通過(guò)元素屬性直接定位到某個(gè)元素慕匠,只能通過(guò)elements方式來(lái)選擇饱须,返回一個(gè)定位對(duì)象的列表.
5.7 通過(guò)id方式定位一組元素 方法: find_elements_by_id(id_value) # id_value:為元素的id屬性值
業(yè)務(wù)場(chǎng)景:
1. 進(jìn)入設(shè)置頁(yè)面
2. 點(diǎn)擊WLAN菜單欄(id定位對(duì)象列表中第1個(gè))-
代碼實(shí)現(xiàn):
定位到一組元素
title = driver.find_elements_by_id("com.android.settings:id/title")
打印title類型,預(yù)期為list
print(type(title))
取title返回列表中的第一個(gè)定位對(duì)象台谊,執(zhí)行點(diǎn)擊操作
title[0].click()
5.8 通過(guò)class方式定位一組元素 方法:find_elements_by_class_name(class_value) # class_value:為元素的class屬性值
業(yè)務(wù)場(chǎng)景:
1.進(jìn)入設(shè)置頁(yè)面
2.點(diǎn)擊WLAN菜單欄(class定位對(duì)象列表中第3個(gè))-
代碼實(shí)現(xiàn):
title = driver.find_elements_by_class_name("android.widget.TextView")打印title類型蓉媳,預(yù)期為list
print(type(title))
取title返回列表中的第一個(gè)定位對(duì)象,執(zhí)行點(diǎn)擊操作
title[3].click()
for index, item in enumerate(ele_list):
print(index, item.text) ```
5.9 通過(guò)xpath方式定位一組元素 方法:find_elements_by_xpath(xpath_value) # xpath_value:為可以定位到元素的xpath語(yǔ)句
業(yè)務(wù)場(chǎng)景:
1. 進(jìn)入設(shè)置頁(yè)面
2. 點(diǎn)擊WLAN菜單欄(xpath中class屬性定位對(duì)象列表中第3個(gè))-
代碼實(shí)現(xiàn):
定位到一組元素
title = driver.find_elements_by_xpath("http://*[contains(@class,'widget.TextView')]")
打印title類型锅铅,預(yù)期為list
print(type(title))
取title返回列表中的第一個(gè)定位對(duì)象酪呻,執(zhí)行點(diǎn)擊操作
title[3].click()