知識概覽
一、 移動端測試是什么
移動端測試是指對移動應用進行的測試,即實體的特性滿足需求的程度。
二、 移動端測試分類
1. app功能測試
業務邏輯正確性測試:依據產品文檔設計測試用例,加上隱性需求用例
兼容性測試:
1. 系統版本:android:原生安卓系統:4.4 5.8。定制版本:小米、華為、魅族..IOS:原生系統:5.0.。。2. 屏幕分辨率:720*1280 1928*1888.,圖片(根據分辨率做一些圖片)3. 網絡狀態:2g 3g 4g 5g wifi
異常測試
1.熱啟動應用:應用由后臺轉換為前臺的過程? 考慮:1.仍然展示退到后臺時的頁面2.希望初始化為首頁2.網絡切換和中斷恢復? ①網絡切換:wifi->2g 4g->3g應用正常可用狀態? ②中斷恢復:4g-→斷網-→4g(下載2M的應用,1%斷網,恢復網絡(斷點續傳,重新下載))3.電話和信息中斷恢復? ①電話:看視頻->電話接18分鐘->返回視頻app? ②信息:玩游戲一>通知欄一個消息->不影響游戲體驗
升級安裝卸載測試:
升級:臨近版本升級(1.0->1.1)跨版本升級(1.0->1.7)保證升級后app可用狀態安裝測試:首次安裝卸載后安裝霍蓋安裝保證app安裝后可用,安裝文件齊全
健壯性測試:
手機資源消耗:cpu內存流量消耗:數據流量加載圖片原間消耗22M 圖片壓縮數據壓縮崩潰恢復測試:app閃退提示終止運行等等保證自啟動可用手動啟動可用
2. App自動化測試
例子:app設計500條測試用例2個人5天用例中有300條是主流業務可以通過腳本實現完成
優點:
1.高效數據絕對正確2.不需要人工干預3.回歸測試
3. 安全測試
二、市場招聘如何?
互聯網移動場景下業務的爆發,導致移動端開發和測試人員需求量增大,市場很缺移動端的人才。 公司待遇:
app功能測試,一般1-3年的功能測試人員月薪8k-15k
app自動化測試,一般1-3年的自動化測試月薪13k-25k
三、主流的移動端自動化工具
支持語言支持系統跨平臺
RobotiumJava僅支持Android系統不支持跨應用
MacacaJava,Python,Node.js支持Android和i0S系統支持跨應用
AppiumJava,C#,Python,php,perl,ruby,Node.js支持Android和iOS系統支持跨應用
自動化工具選擇的關注點:
足否支持native,webiew
是否支持獲取toast
是否支持跨應用
四、UIAutomatorviewer手機控件查看工具
1. 工具簡介
用來掃描和分析Android應用程序的UI控件的工具。
2. 如何使用
進入SDK目錄下的tools目錄,打開uiautomatorviewer
電腦連接真機或打開android模擬器
啟動待測試app
點擊uiautomatorviewer的左上角Device Screenshot,會生成app當前頁面的UI控件截圖
選擇截圖上需要查看的控件,即可瀏覽該控件的id,class,text,坐標等信息
APP移動端測試高級
一、Appium介紹
Appium是一個移動端的自動化框架,可用于測試原生應用、移動網頁應用和混合型應用,且是跨平臺的。可用于IOS和Android以及firefox的操作系統。
原生的應用是指用android或ios的sdk編寫的應用;移動網頁應用是指網頁應用,類似于ios中safari應用或者Chrome應用或者類瀏覽器的應用;混合應用是指一種包裹webview的應用,原生應用于網頁內容交互性的應用。
重要的是Appium是跨平臺的,何為跨平臺,意思就是可以針對不同的平臺用一套api來編寫測試用例。
二、環境搭建
主要幾個點如下:
image.png
1. appium安裝
直接解壓即可,打開Appium.exe
image.png
啟動成功展示如下:
image.png
2. Appium庫安裝
# 安裝pip install Appium-Python-Client# 檢驗是否成功piplist
三、Appium使用
1. 打開模擬器或真機的應用
①打開手機應用
②打開Appium
③創建一個python項目,并創建一個文件
④將下面代碼復制到文件中
⑤獲取當前應用包名和啟動activity并修改文件
fromappiumimportwebdriver# server 啟動參數desired_caps=dict()# 設備信息# 平臺信息,不區分大小寫desired_caps['platformName']='Android'# 系統版本,7.1.2可以寫[7 ,7.1 , 7.1.2]desired_caps['platformVersion']='7.1.2'# 設備名稱,可以隨便寫,但是不能亂寫,Android可以隨便寫,但是ios必須正確的寫desired_caps['deviceName']='emulator-5554'# app的信息desired_caps['appPackage']='com.android.settings'desired_caps['appActivity']='.Settings'# 聲明我們的driver對象driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)driver.quit()
2. 腳本內啟動其他app
driver.start_activity(appPackage,appActivity)
3. 關閉app
driver.close_app()? # 關閉當前操作的app,不會關閉驅動對象
4. 關閉驅動對象
driver.quit()? # 關閉驅動對象,同時關閉所有關聯的app
三、App基礎操作API
完成app自動化需要一些基礎條件的支持,本節將講解APP初始化API。
3.1前置代碼
# server 啟動參數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']=Truedesired_caps['resetKeyboard']=True# 聲明driver對象driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
3.2 安裝APK到手機
driver.install_app(app_path)
參數:app_path:腳本機器中APK文件路徑
3.3 手機中移除APP
driver.remove_app(app_id)
參數:app_id:需要卸載的app包名
3.4 判斷APP是否已安裝
driver.is_app_installed(bundle_id)
參數:bundle_id: 可以傳入app包名,返回結果為True(已安裝) / False(未安裝)
3.5 發送文件到手機
importbase64data=str(base64.b64encode(data.encode('utf-8')),'utf-8')driver.push_file(path,data)參數:
path:手機設備上的路徑(例如:/sdcard/a.txt)
data:文件內數據,要求base64編碼
Python3.x中字符都為unicode編碼,而b64encode函數的參數為byte類型,需要先轉碼;
生成的數據為byte類型,需要將byte轉換回去。
3.6 從手機中拉取文件
importbase64data=driver.pull_file(path)# 返回數據為base64編碼print(str(base64.b64decode(data),'utf-8'))# base64解碼
參數: path: 手機設備上的路徑
3.7獲取當前屏幕內元素結構
driver.page_source
作用:返回當前頁面的文檔結構,判斷特定的元素是否存在
四、手機控件查看工具uiautomatorviewer
4.1 工具簡介
用來掃描和分析Android應用程序的UI控件的工具.
4.1 如何使用
進入SDK目錄下的tools目錄,打開uiautomatorviewer
電腦連接真機或打開android模擬器
啟動待測試app
點擊uiautomatorviewer的左上角Device Screenshot,會生成app當前頁面的UI控件截圖
image.png
選擇截圖上需要查看的控件,即可瀏覽該控件的id,class,text,坐標等信息
image.png
五、APP元素定位操作
手工測試主要通過可見按鈕操作,而自動化是通過元素進行交互操作。
元素的基本定位基于當前屏幕范圍內展示的可見元素。
5.1 Appium常用元素定位方式
namevalue
idid屬性值
classclass屬性值
xpathxpath表達式
5.2 前置代碼
fromappiumimportwebdriver# server 啟動參數desired_caps={}# 設備信息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對象driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
5.3 通過id定位
方法:find_element_by_id(id_value) # id_value:為元素的id屬性值
業務場景:
1. 進入設置頁面
2. 通過ID定位方式點擊搜索按鈕
代碼實現:
driver.find_element_by_id("com.android.settings:id/search").click()driver.quit()
5.4 通過class定位
方法:find_element_by_class_name(class_value) # class_value:為元素的class屬性值
業務場景:
1. 進入設置頁面
2. 點擊搜索按鈕
3. 通過class定位方式點擊輸入框的返回按鈕
代碼實現:
# id 點擊搜索按鈕driver.find_element_by_id("com.android.settings:id/search").click()# class 點擊輸入框返回按鈕driver.find_element_by_class_name('android.widget.ImageButton').click()driver.quit()
5.5 通過xpath定位
方法:find_element_by_xpath(xpath_value) # xpath_value:為可以定位到元素的xpath語句
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可以是部分值
業務場景:
1. 進入設置頁面
2. 點擊WLAN菜單欄
代碼實現:
# xpath 點擊WLAN按鈕driver.find_element_by_xpath("http://*[contains(@text,'WLA')]").click()
5.6 定位一組元素,注意element -> elements
應用場景為元素值重復,無法通過元素屬性直接定位到某個元素,只能通過elements方式來選擇,返回一個定位對象的列表.
5.7 通過id方式定位一組元素
方法: find_elements_by_id(id_value) # id_value:為元素的id屬性值
業務場景:
1. 進入設置頁面
2. 點擊WLAN菜單欄(id定位對象列表中第1個)
代碼實現:
# 定位到一組元素title = driver.find_elements_by_id("com.android.settings:id/title")# 打印title類型,預期為listprint(type(title))# 取title返回列表中的第一個定位對象,執行點擊操作title[0].click()
5.8 通過class方式定位一組元素
方法:find_elements_by_class_name(class_value) # class_value:為元素的class屬性值
業務場景:
1.進入設置頁面
2.點擊WLAN菜單欄(class定位對象列表中第3個)
代碼實現:
title = driver.find_elements_by_class_name("android.widget.TextView")# 打印title類型,預期為listprint(type(title))# 取title返回列表中的第一個定位對象,執行點擊操作title[3].click()for index, item in enumerate(ele_list):? print(index, item.text)? ```
5.9 通過xpath方式定位一組元素
方法:find_elements_by_xpath(xpath_value) # xpath_value:為可以定位到元素的xpath語句
業務場景:
1. 進入設置頁面
2. 點擊WLAN菜單欄(xpath中class屬性定位對象列表中第3個)
代碼實現:
# 定位到一組元素title = driver.find_elements_by_xpath("http://*[contains(@class,'widget.TextView')]")# 打印title類型,預期為listprint(type(title))# 取title返回列表中的第一個定位對象,執行點擊操作title[3].click()
六、WebDriverWait 顯示等待操作
在一個超時時間范圍內,每隔一段時間去搜索一次元素是否存在,如果存在返回定位對象,如果不存在直到超時時間到達,報超時異常錯誤。
方法:WebDriverWait(driver, timeout, poll_frequency).until(method)
參數:
1.driver:手機驅動對象
2.timeout:搜索超時時間
3.poll_frequency:每次搜索間隔時間,默認時間為0.5s
4.method:定位方法(匿名函數)
匿名函數:
lambda x: x
等價于python函數:
def test(x):
return x
使用示例:
WebDriverWait(driver,timeout,poll_frequency).until(lambdax:x.find_elements_by_id(id_value))
解釋:
1.x傳入值為:driver,所以才可以使用定位方法。
函數運行過程:
1.實例化WebDriverWait類,傳入driver對象,之后driver對象被賦值給WebDriverWait的一個類變量:self._driver
2.until為WebDriverWait類的方法,until傳入method方法(即匿名函數),之后method方法會被傳入self._driver
3.搜索到元素后until返回定位對象,沒有搜索到函數until返回超時異常錯誤.
業務場景:
1.進入設置頁面
2.通過ID定位方式點擊搜索按鈕
代碼實現:
fromselenium.webdriver.support.waitimportWebDriverWait# 導入WebDriverWait? 類# 超時時間為30s,每隔1秒搜索一次元素是否存在,如果元素存在返回定位對象并退出search_button=WebDriverWait(driver,30,1).until(lambdadriver:driver.find_element_by_id("com.android.settings:id/search"))search_button.click()driver.quit()
七、APP元素信息操作API
本節講介紹手機端元素信息的獲取以及基本的輸入操作。
7.1. 點擊元素
ele.click()
7.2.發送數據到輸入框
方法:send_keys(vaue) # value:需要發送到輸入框內的文本
業務場景:
1.打開設置
2.點擊搜索按鈕
3.輸入內容abc
代碼實現:
# 點擊搜索按鈕driver.find_element_by_id("com.android.settings:id/search").click()# 定位到輸入框并輸入abcdriver.find_element_by_id("android:id/search_src_text").send_keys("abc")
重點:大家可以將輸入的abc 改成 輸入中文,得到的結果:輸入框無任何值輸入且程序不會抱錯
解決輸入中文問題:
1.server 啟動參數增加兩個參數配置? ? ? desired_caps['unicodeKeyboard']=Truedesired_caps['resetKeyboard']=True2.再次運行會發現運行成功# 點擊搜索按鈕driver.find_element_by_id("com.android.settings:id/search").click()# 定位到輸入框并輸入abcdriver.find_element_by_id("android:id/search_src_text").send_keys("積云教育")
7.3. 清空輸入框內容
方法:clear()
業務場景:
1.打開設置
2.點擊搜索按鈕
3.輸入內容abc
4.刪除已輸入abc
代碼實現:
# 點擊搜索按鈕driver.find_element_by_id("com.android.settings:id/search").click()# 定位到輸入框并輸入abcinput_text = driver.find_element_by_id("android:id/search_src_text")# 輸入abcinput_text.send_keys("abc")time.sleep(1)# 刪除abcinput_text.clear()
7.4. 獲取元素的文本內容
方法: text
業務場景:
1.進入設置
2.獲取所有元素class屬性為“android.widget.TextView”的文本內容
代碼實現:
ele_list=driver.find_elements_by_class_name("android.widget.TextView")foreinele_list:print(e.text)forindex,iteminenumerate(ele_list):print(index,item.text)
執行結果:
0 設置? 1? 2 移動數據網絡已關閉? 3 無線和網絡? 4 WLAN? 5 "guest"? 6 藍牙? 7 已停用? 8 流量使用情況? 9 已使用 0 B 的數據? 10 更多? 11 設備? 12 顯示? 13 自動調節亮度功能已關閉? 14 通知? 15 已允許所有應用發送通知
7.5. 獲取元素的屬性值
方法: get_attribute(value) # value:元素的屬性
?? value='name' 返回content-desc / text屬性值
?? value='text' 返回text的屬性值
?? value='className' 返回 class屬性值,只有 API=>18 才能支持
?? value='resourceId' 返回 resource-id屬性值,只有 API=>18 才能支持
業務場景:
1.進入設置
2.獲取搜索按鈕的content-desc屬性值
代碼實現:
# 定位到搜索按鈕get_value = driver.find_element_by_id("com.android.settings:id/search")print(get_value.get_attribute("content-desc"))執行結果:? ? ? ? 搜索
7.6. 獲取元素在屏幕上的坐標
方法:location
業務場景:
1.進入設置頁面
2.獲取搜索按鈕在屏幕的坐標位置
代碼實現:
# 定位到搜索按鈕get_value = driver.find_element_by_id("com.android.settings:id/search")# 打印搜索按鈕在屏幕上的坐標print(get_value.location){'y': 44, 'x': 408}
7.7. 獲取app包名和啟動名
獲取包名方法:current_package
獲取啟動名:current_activity
業務場景:
1.啟動設置
2.獲取包名和啟動名
代碼實現:
print(driver.current_package)print(driver.current_activity)
執行結果:
com.tencent.news.activity.SplashActivity
八、APP元素事件操作API
8.1. 前置代碼
fromappiumimportwebdriver# server 啟動參數desired_caps={}# 設備信息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對象driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
8.2. swip滑動事件
??從一個坐標位置滑動到另一個坐標位置,只能是兩個點之間的滑動
方法:swipe(start_x, start_y, end_x, end_y, duration=None)
參數:
1.start_x:起點X軸坐標
2.start_y:起點Y軸坐標
3.end_x: 終點X軸坐標
4.end_y,: 終點Y軸坐標
5.duration: 滑動這個操作一共持續的時間長度,單位:ms
業務場景:
1.進入設置
2.從坐標(148,659)滑動到坐標(148,248)
代碼實現:
# 滑動沒有持續時間driver.swipe(188,659,148,248)# 滑動持續5秒的時間driver.swipe(188,659,148,248,5000)
8.3. scroll滑動事件
?? 從一個元素滑動到另一個元素,直到頁面自動停止
方法:scroll(origin_el, destination_el)
參數:
1.origin_el:滑動開始的元素
2.destination_el:滑動結束的元素
業務場景:
1.進入設置頁
2.模擬手指從存儲菜單位置 到 WLAN菜單位置的上滑操作
代碼實現:
# 定位到存儲菜單欄el1 = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]")# 定位到WLAN菜單欄el2 = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")# 執行滑動操作driver.scroll(el1,el2)
8.4. drag拖拽事件
?? 從一個元素滑動到另一個元素,第二個元素替代第一個元素原本屏幕上的位置
方法:drag_and_drop(origin_el, destination_el)
參數:
1.origin_el:滑動開始的元素
2.destination_el:滑動結束的元素
業務場景:
1.進入設置頁
2.模擬手指將存儲菜單 滑動到 WLAN菜單欄位置
代碼實現:
# 定位到存儲菜單欄el1 = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]")# 定位到WLAN菜單欄el2 = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")# 執行滑動操作driver.drag_and_drop(el1,el2)
8.5. 應用置于后臺事件
APP放置后臺,模擬熱啟動
方法:background_app(seconds)
參數:
1.seconds:停留在后臺的時間,單位:秒
業務場景:
1.進入設置頁
2.將APP置于后臺5s
代碼實現:
driver.background_app(5)
效果:
app置于后臺5s后,再次展示當前頁面
九、APP模擬手勢高級操作
TouchAction是AppiumDriver的輔助類,主要針對手勢操作,比如滑動、長按、拖動等,原理是將一系列的動作放在一個鏈條中發送到服務器,服務器接受到該鏈條后,解析各個動作,逐個執行。
9.1. 前置代碼
fromappiumimportwebdriver# server 啟動參數desired_caps={}# 設備信息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對象driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
?? 所有手勢都要通過執行函數才會運行.
9.2. 手指輕敲操作
模擬手指輕敲一下屏幕操作
方法:tap(element=None, x=None, y=None)
方法:perform() # 發送命令到服務器執行操作
參數:
1.element:被定位到的元素
2.x:相對于元素左上角的坐標,通常會使用元素的X軸坐標
3.y:通常會使用元素的Y軸坐標
業務場景:
1.進入設置
2.點擊WLAN選項
代碼實現:
# 通過元素定位方式敲擊屏幕el = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")TouchAction(driver).tap(el).perform()# 通過坐標方式敲擊屏幕,WLAN坐標:x=155,y=250# TouchAction(driver).tap(x=155,y=250).perform()
9.3. 手指按操作
模擬手指按下屏幕,按就要對應著離開.
方法:press(el=None, x=None, y=None)
方法:release() # 結束動作,手指離開屏幕
參數:
1.element:被定位到的元素
2.x:通常會使用元素的X軸坐標
3.y:通常會使用元素的Y軸坐標
業務場景:
1.進入設置
2.點擊WLAN選項
代碼實現:
# 通過元素定位方式按下屏幕el = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")TouchAction(driver).press(el).release().perform()# 通過坐標方式按下屏幕,WLAN坐標:x=155,y=250# TouchAction(driver).press(x=155,y=250).release().perform()
9.4. 等待操作
方法:wait(ms=0)
參數:
ms:暫停的毫秒數
業務場景:
1.進入設置
2.點擊WLAN選項
3.長按WiredSSID選項5秒
代碼實現:
# 點擊WLANdriver.find_element_by_xpath("http://*[contains(@text,'WLAN')]").click()# 定位到WiredSSIDel =driver.find_element_by_id("android:id/title")# 通過元素定位方式長按元素TouchAction(driver).press(el).wait(5000).perform()# 通過坐標方式模擬長按元素# 添加等待(有長按)/不添加等待(無長按效果)# TouchAction(driver).press(x=770,y=667).wait(5000).release().perform()
9.5. 手指長按操作
模擬手機按下屏幕一段時間,按就要對應著離開.
方法:long_press(el=None, x=None, y=None, duration=1000)
參數:
1.element:被定位到的元素
2.x:通常會使用元素的X軸坐標
3.y:通常會使用元素的Y軸坐標
4.duration:持續時間,默認為1000ms
業務場景:
1.進入設置
2.點擊WLAN選項
3.長按WiredSSID選項5秒
代碼實現:
# 點擊WLANdriver.find_element_by_xpath("http://*[contains(@text,'WLAN')]").click()# 定位到WiredSSIDel =driver.find_element_by_id("android:id/title")# 通過元素定位方式長按元素TouchAction(driver).long_press(el,duration=5000).release().perform()# 通過坐標方式長按元素,WiredSSID坐標:x=770,y=667# 添加等待(有長按)/不添加等待(無長按效果)# TouchAction(driver).long_press(x=770,y=667).perform()
9.6. 手指移動操作
模擬手機的滑動操作
方法:move_to(el=None, x=None, y=None)
參數:
1.el:定位的元素
2.x:相對于前一個元素的X軸偏移量
3.y:相對于前一個元素的Y軸偏移量
業務場景1:
1.進入設置
2.向上滑動屏幕
代碼實現:
# 定位到存儲el = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]")# 定位到更多el1 = driver.find_element_by_xpath("http://*[contains(@text,'更多')]")# 元素方式滑動TouchAction(driver).press(el).move_to(el1).release().perform()# 坐標的方式滑動# TouchAction(driver).press(x=240,y=600).wait(100).move_to(x=240,y=100).release().perform()# 注意press連接一個move_to實際調用的是swip方法,可在log中查詢,不要給相對坐標。
業務場景2:
1.進入設置
2.向上滑動屏幕到可見"安全"選項
3.進入到安全
4.點擊屏幕鎖定方式
5.點擊圖案
6.繪制圖案
代碼實現:
# 定位到WLANel1 = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")# 定位到存儲el2 = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]")# 存儲上滑到WLANdriver.drag_and_drop(el2,el1)# 定位到用戶el3 = driver.find_element_by_xpath("http://*[contains(@text,'用戶')]")# 注意 這次使用drag_and_drop方法,傳入的"存儲定位"仍使用其原始在屏幕上的位置,所以是由存儲滑動到用戶才可以上滑,否則需要重新"定位存儲"# 存儲上滑倒用戶位置driver.drag_and_drop(el2,el3)# 點擊安全按鈕driver.find_element_by_xpath("http://*[contains(@text,'安全')]").click()# 點擊屏幕鎖定方式按鈕driver.find_element_by_xpath("http://*[contains(@text,'屏幕鎖定')]").click()# 點擊圖案按鈕driver.find_element_by_xpath("http://*[contains(@text,'圖案')]").click()# 繪制圖案四個坐標 1:(244,967) 2:(723,967) 3:(723,1442) 4:(244,1916)TouchAction(driver).press(x=244,y=967).wait(100).move_to(x=479,y=0).wait(100)\? ? ? ? ? .move_to(x=0,y=475).wait(100).move_to(x=-479,y=474).release().perform()
十、手機操作API
針對手機的一些常用設置功能進行操作.
10.1. 前置代碼
fromappiumimportwebdriver# server 啟動參數desired_caps={}# 設備信息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對象driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
10.2. 獲取手機時間
方法:device_time
代碼實現:
# 獲取當前手機的時間print(driver.device_time)
執行結果:
Wed Dec 27 08:52:45 EST 2017
10.3. 獲取手機的寬高
獲取手機的寬高,可以根據寬高做一些坐標的操作
方法:get_window_size()
代碼實現:
print(driver.get_window_size())
執行結果:
{'height': 800, 'width': 480}
10.4. 發送鍵到設備
模擬系統鍵值的操作,比如操作home鍵,音量鍵,返回鍵等。
參數:
keycode:發送給設備的關鍵代碼
metastate:關于被發送的關鍵代碼的元信息,一般為默認值
業務場景:
1.打開設置
2.按多次音量增加鍵
代碼實現:
for i inrange(3):driver.keyevent(24)
Appium---Android的keycode鍵值
adb命令使用
adb shell input keyevent XX(EventCode) #輸入對應的鍵值
adb shell input text "www.baidu.com"
?#向瀏覽器發送文本
EventCodeKeyEventEventName
0KEYCODE_UNKNOWN未知鍵
1KEYCODE_SOFT_LEFT左鍵
2KEYCODE_SOFT_RIGHT右鍵
3KEYCODE_HOMEHome鍵
4KEYCODE_BACK返回鍵
5KEYCODE_CALL撥號鍵
6KEYCODE_ENDCALL掛機鍵
7KEYCODE_0按鍵“0”
8KEYCODE_1按鍵“1”
9KEYCODE_2按鍵“2”
10KEYCODE_3按鍵“3”
11KEYCODE_4按鍵“4”
12KEYCODE_5按鍵“5”
13KEYCODE_6按鍵“6”
14KEYCODE_7按鍵“7”
15KEYCODE_8按鍵“8”
16KEYCODE_9按鍵“9”
17KEYCODE_STAR按鍵“*”
18KEYCODE_POUND按鍵“#”
19KEYCODE_DPAD_UP導航鍵 向上
20KEYCODE_DPAD_DOWN導航鍵 向下
21KEYCODE_DPAD_LEFT導航鍵 向左
22KEYCODE_DPAD_RIGHT導航鍵 向右
23KEYCODE_DPAD_CENTER導航鍵 確定
24KEYCODE_VOLUME_UP音量鍵加
25KEYCODE_VOLUME_DOWN音量鍵減
26KEYCODE_POWER電源鍵
27KEYCODE_CAMERA相機鍵
28KEYCODE_CLEAR清除鍵
29KEYCODE_A按鍵“A”
30KEYCODE_B按鍵“B”
31KEYCODE_C按鍵“C”
32KEYCODE_D按鍵“D”
33KEYCODE_E按鍵“E”
34KEYCODE_F按鍵“F”
35KEYCODE_G按鍵“G”
36KEYCODE_H按鍵“H”
37KEYCODE_I按鍵“I”
38KEYCODE_J按鍵“J”
39KEYCODE_K按鍵“K”
40KEYCODE_L按鍵“L”
41KEYCODE_M按鍵“M”
42KEYCODE_N按鍵“N”
43KEYCODE_O按鍵“O”
44KEYCODE_P按鍵“P”
45KEYCODE_Q按鍵“Q”
46KEYCODE_R按鍵“R”
47KEYCODE_S按鍵“S”
48KEYCODE_T按鍵“T”
49KEYCODE_U按鍵“U”
50KEYCODE_V按鍵“V”
51KEYCODE_W按鍵“W”
52KEYCODE_X按鍵“X”
53KEYCODE_Y按鍵“Y”
54KEYCODE_Z按鍵“Z”
55KEYCODE_COMMA按鍵“,”
56KEYCODE_PERIOD按鍵‘.’
57KEYCODE_ALT_LEFT組合鍵 Alt+Left
58KEYCODE_ALT_RIGHT組合鍵 Alt+Right
59KEYCODE_SHIFT_LEFT組合鍵 Shift+Left
60KEYCODE_SHIFT_RIGHT組合鍵 Shift+Left
61KEYCODE_TABTab鍵
62KEYCODE_SPACE空格鍵
63KEYCODE_SYM選擇輸入法
64KEYCODE_EXPLORER瀏覽器
65KEYCODE_ENVELOPE郵件
66KEYCODE_ENTER回車鍵
67KEYCODE_DEL退格鍵
68KEYCODE_GRAVE按鍵‘`’
69KEYCODE_MINUS按鍵‘-’
70KEYCODE_EQUALS按鍵‘=’
71KEYCODE_LEFT_BRACKET按鍵‘[’
72KEYCODE_RIGHT_BRACKET按鍵‘]’
73KEYCODE_BACKSLASH按鍵‘\’
74KEYCODE_SEMICOLON按鍵‘,’
75KEYCODE_APOSTROPHE按鍵‘'’(單引號)
76KEYCODE_SLASH按鍵‘/’
77KEYCODE_AT按鍵‘@’
78KEYCODE_NUM按鍵Number modifier
79KEYCODE_HEADSETHOOK按鍵Headset Hook
80KEYCODE_FOCUS拍照對焦鍵
81KEYCODE_PLUS按鍵‘+’
82KEYCODE_MENU菜單鍵
83KEYCODE_NOTIFICATION通知鍵
84KEYCODE_SEARCH搜索鍵
85TAG_LAST_KEYCODE
10.5. 操作手機通知欄
打開手機的通知欄,可以獲取通知欄的相關信息和元素操作
方法:open_notifications()
業務場景:
1.啟動設置
2.打開通知欄
代碼實現:
driver.open_notifications()
10.6. 獲取手機當前網絡
獲取手機當前連接的網絡
方法:network_connection
業務場景:獲取手機當前網絡模式
代碼實現:
print(driver.network_connection)
執行結果:
6
Value (Alias)DataWifiAirplane Mode
0 (None)000
1 (Airplane Mode)001
2 (Wifi only)010
4 (Data only)100
6 (All network on)110
10.7. 設置手機網絡
更改手機的網絡模式,模擬特殊網絡情況下的測試用例
方法:set_network_connection(connectionType)
參數:
connectionType:需要被設置成為的網絡類型
業務場景:
1.啟動設置
2.設置手機網絡為飛行模式
代碼實現:
driver.set_network_connection(1)
10.8. 手機截圖
截取手機當前屏幕,保存指定格式圖片到設定位置
方法:get_screenshot_as_file(filename)
參數:
filename:指定路徑下,指定格式的圖片.
業務場景:
1.打開設置頁面
2.截圖當前頁面保存到當前目錄,命名為screen.png
代碼實現:
importosdriver.get_screenshot_as_file(os.getcwd()+os.sep+'./screen.png')
執行結果:
當前目錄下會生成screen.png文件
十一、腳本錄制
11.1. 認識界面
image.png
11.2. 點擊開始錄制按鍵開始錄制腳本
點擊頂部導航欄左側第一個“選擇元素”按鍵選定搜索欄,然后點擊右邊點“點擊”按鍵進行操作(錄制過程就是先選擇錄制窗口左邊的APP元素,然后錄制窗口右邊的操作方式)。
錄制完成后點擊“停止錄制”按鍵,錄制窗口右上角會同步顯示操作代碼,選擇代碼類型,將模板代碼轉換成正式代碼,復制代碼到Pycharm。
代碼復制到pycharm后,最好是在每個操作或者頁面切換處加上等待時間,否則會因為網速、APP設計問題或者其他原因,無法及時到達下一個頁面,導致APPIUM無法獲取頁面元素而定位元素失敗,在pycharm運行時報錯。代碼編輯好后點擊pycharm的運行按鍵,APPium就會在手機上面自動運行腳本了。