一女淑、Appium介紹
Appium是一個移動端的自動化框架瞭郑,可用于測試原生應用、移動網(wǎng)頁應用和混合型應用鸭你,且是跨平臺的屈张。可用于IOS和Android以及firefox的操作系統(tǒng)袱巨。
原生的應用是指用android或ios的sdk編寫的應用阁谆;移動網(wǎng)頁應用是指網(wǎng)頁應用,類似于ios中safari應用或者Chrome應用或者類瀏覽器的應用愉老;混合應用是指一種包裹webview的應用,原生應用于網(wǎng)頁內(nèi)容交互性的應用场绿。
重要的是Appium是跨平臺的,何為跨平臺嫉入,意思就是可以針對不同的平臺用一套api來編寫測試用例焰盗。
二、環(huán)境搭建
主要幾個點如下:
1. appium安裝
直接解壓即可咒林,打開Appium.exe
啟動成功展示如下:
2. Appium庫安裝
# 安裝
pip install Appium-Python-Client
# 檢驗是否成功
pip list
三熬拒、Appium使用
1. 打開模擬器或真機的應用
①打開手機應用
②打開Appium
③創(chuàng)建一個python項目,并創(chuàng)建一個文件
④將下面代碼復制到文件中
⑤獲取當前應用包名和啟動activity并修改文件
from appium import webdriver
# server 啟動參數(shù)
desired_caps = dict()
# 設備信息
# 平臺信息垫竞,不區(qū)分大小寫
desired_caps['platformName'] = 'Android'
# 系統(tǒng)版本澎粟,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. 腳本內(nèi)啟動其他app
driver.start_activity(appPackage,appActivity)
3. 關閉app
driver.close_app() # 關閉當前操作的app重贺,不會關閉驅(qū)動對象
4. 關閉驅(qū)動對象
driver.quit() # 關閉驅(qū)動對象,同時關閉所有關聯(lián)的app
三宫补、App基礎操作API
完成app自動化需要一些基礎條件的支持檬姥,本節(jié)將講解APP初始化API。
3.1前置代碼
# server 啟動參數(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對象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
3.2 安裝APK到手機
driver.install_app(app_path)
參數(shù):app_path:腳本機器中APK文件路徑
3.3 手機中移除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ā)送文件到手機
import base64
data = str(base64.b64encode(data.encode('utf-8')),'utf-8')
driver.push_file(path,data)
參數(shù):
path:手機設備上的路徑(例如:/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 從手機中拉取文件
import base64
data = driver.pull_file(path) # 返回數(shù)據(jù)為base64編碼
print(str(base64.b64decode(data),'utf-8')) # base64解碼
參數(shù): path: 手機設備上的路徑
3.7獲取當前屏幕內(nèi)元素結(jié)構(gòu)
driver.page_source
作用:返回當前頁面的文檔結(jié)構(gòu),判斷特定的元素是否存在
四稚晚、手機控件查看工具uiautomatorviewer
4.1 工具簡介
用來掃描和分析Android應用程序的UI控件的工具.
4.1 如何使用
進入SDK目錄下的tools目錄崇堵,打開uiautomatorviewer
電腦連接真機或打開android模擬器
啟動待測試app
-
點擊uiautomatorviewer的左上角Device Screenshot,會生成app當前頁面的UI控件截圖
-
選擇截圖上需要查看的控件,即可瀏覽該控件的id,class,text,坐標等信息
五客燕、APP元素定位操作
手工測試主要通過可見按鈕操作鸳劳,而自動化是通過元素進行交互操作。
元素的基本定位基于當前屏幕范圍內(nèi)展示的可見元素也搓。
5.1 Appium常用元素定位方式
name | value |
---|---|
id | id屬性值 |
class | class屬性值 |
xpath | xpath表達式 |
5.2 前置代碼
from appium import webdriver
# server 啟動參數(shù)
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屬性值
業(yè)務場景:
1. 進入設置頁面
2. 通過ID定位方式點擊搜索按鈕-
代碼實現(xiàn):
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屬性值
- 業(yè)務場景:
1. 進入設置頁面
2. 點擊搜索按鈕
3. 通過class定位方式點擊輸入框的返回按鈕 - 代碼實現(xiàn):
# 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可以是部分值
業(yè)務場景:
1. 進入設置頁面
2. 點擊WLAN菜單欄-
代碼實現(xiàn):
# 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屬性值
業(yè)務場景:
1. 進入設置頁面
2. 點擊WLAN菜單欄(id定位對象列表中第1個)-
代碼實現(xiàn):
# 定位到一組元素 title = driver.find_elements_by_id("com.android.settings:id/title") # 打印title類型幔摸,預期為list print(type(title)) # 取title返回列表中的第一個定位對象,執(zhí)行點擊操作 title[0].click()
5.8 通過class方式定位一組元素
方法:find_elements_by_class_name(class_value) # class_value:為元素的class屬性值
業(yè)務場景:
1.進入設置頁面
2.點擊WLAN菜單欄(class定位對象列表中第3個)
代碼實現(xiàn):
title = driver.find_elements_by_class_name("android.widget.TextView")
打印title類型颤练,預期為list
print(type(title))
取title返回列表中的第一個定位對象既忆,執(zhí)行點擊操作
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語句
業(yè)務場景:
- 進入設置頁面
- 點擊WLAN菜單欄(xpath中class屬性定位對象列表中第3個)
代碼實現(xiàn):
定位到一組元素
title = driver.find_elements_by_xpath("http://*[contains(@class,'widget.TextView')]")
打印title類型,預期為list
print(type(title))
取title返回列表中的第一個定位對象嗦玖,執(zhí)行點擊操作
title[3].click()
六卷要、WebDriverWait 顯示等待操作
在一個超時時間范圍內(nèi)母债,每隔一段時間去搜索一次元素是否存在鳞上,如果存在返回定位對象萄凤,如果不存在直到超時時間到達扣典,報超時異常錯誤程梦。
方法:WebDriverWait(driver, timeout, poll_frequency).until(method)
參數(shù):
1.driver:手機驅(qū)動對象
2.timeout:搜索超時時間
3.poll_frequency:每次搜索間隔時間罩息,默認時間為0.5s
4.method:定位方法(匿名函數(shù))
匿名函數(shù):
lambda x: x
等價于python函數(shù):
def test(x):
return x
使用示例:
WebDriverWait(driver, timeout, poll_frequency).until(lambda x:x.find_elements_by_id(id_value))
解釋:
1.x傳入值為:driver荞胡,所以才可以使用定位方法。
函數(shù)運行過程:
1.實例化WebDriverWait類娱局,傳入driver對象彰亥,之后driver對象被賦值給WebDriverWait的一個類變量:self._driver
2.until為WebDriverWait類的方法,until傳入method方法(即匿名函數(shù))衰齐,之后method方法會被傳入self._driver
3.搜索到元素后until返回定位對象任斋,沒有搜索到函數(shù)until返回超時異常錯誤.
業(yè)務場景:
1.進入設置頁面
2.通過ID定位方式點擊搜索按鈕
代碼實現(xiàn):
from selenium.webdriver.support.wait import WebDriverWait # 導入WebDriverWait 類
超時時間為30s,每隔1秒搜索一次元素是否存在耻涛,如果元素存在返回定位對象并退出
search_button = WebDriverWait(driver, 30, 1).until(lambda driver:driver.find_element_by_id("com.android.settings:id/search"))
search_button.click()
driver.quit()
七废酷、APP元素信息操作API
本節(jié)講介紹手機端元素信息的獲取以及基本的輸入操作。
7.1. 點擊元素
ele.click()
7.2.發(fā)送數(shù)據(jù)到輸入框
方法:send_keys(vaue) # value:需要發(fā)送到輸入框內(nèi)的文本
業(yè)務場景:
1.打開設置
2.點擊搜索按鈕
3.輸入內(nèi)容abc
代碼實現(xiàn):
點擊搜索按鈕
driver.find_element_by_id("com.android.settings:id/search").click()
定位到輸入框并輸入abc
driver.find_element_by_id("android:id/search_src_text").send_keys("abc")
重點:大家可以將輸入的abc 改成 輸入中文抹缕,得到的結(jié)果:輸入框無任何值輸入且程序不會抱錯
解決輸入中文問題:
1.server 啟動參數(shù)增加兩個參數(shù)配置
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
2.再次運行會發(fā)現(xiàn)運行成功
# 點擊搜索按鈕
driver.find_element_by_id("com.android.settings:id/search").click()
# 定位到輸入框并輸入abc
driver.find_element_by_id("android:id/search_src_text").send_keys("積云教育")
7.3. 清空輸入框內(nèi)容
方法:clear()
業(yè)務場景:
1.打開設置
2.點擊搜索按鈕
3.輸入內(nèi)容abc
4.刪除已輸入abc
代碼實現(xiàn):
點擊搜索按鈕
driver.find_element_by_id("com.android.settings:id/search").click()
定位到輸入框并輸入abc
input_text = driver.find_element_by_id("android:id/search_src_text")
輸入abc
input_text.send_keys("abc")
time.sleep(1)
刪除abc
input_text.clear()
7.4. 獲取元素的文本內(nèi)容
方法: text
業(yè)務場景:
1.進入設置
2.獲取所有元素class屬性為“android.widget.TextView”的文本內(nèi)容
代碼實現(xiàn):
ele_list = driver.find_elements_by_class_name("android.widget.TextView")
for e in ele_list:
print(e.text)
for index, item in enumerate(ele_list):
print(index, item.text)
執(zhí)行結(jié)果:
0 設置
1
2 移動數(shù)據(jù)網(wǎng)絡已關閉
3 無線和網(wǎng)絡
4 WLAN
5 "guest"
6 藍牙
7 已停用
8 流量使用情況
9 已使用 0 B 的數(shù)據(jù)
10 更多
11 設備
12 顯示
13 自動調(diào)節(jié)亮度功能已關閉
14 通知
15 已允許所有應用發(fā)送通知
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 才能支持
業(yè)務場景:
1.進入設置
2.獲取搜索按鈕的content-desc屬性值
代碼實現(xiàn):
定位到搜索按鈕
get_value = driver.find_element_by_id("com.android.settings:id/search")
print(get_value.get_attribute("content-desc"))
執(zhí)行結(jié)果:
搜索
7.6. 獲取元素在屏幕上的坐標
方法:location
業(yè)務場景:
1.進入設置頁面
2.獲取搜索按鈕在屏幕的坐標位置
代碼實現(xiàn):
定位到搜索按鈕
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
業(yè)務場景:
1.啟動設置
2.獲取包名和啟動名
代碼實現(xiàn):
print(driver.current_package)
print(driver.current_activity)
執(zhí)行結(jié)果:
com.tencent.news
.activity.SplashActivity
八卓研、APP元素事件操作API
8.1. 前置代碼
from appium import webdriver
# server 啟動參數(shù)
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)
-
參數(shù):
1.start_x:起點X軸坐標
2.start_y:起點Y軸坐標
3.end_x: 終點X軸坐標
4.end_y,: 終點Y軸坐標
5.duration: 滑動這個操作一共持續(xù)的時間長度趴俘,單位:ms- 業(yè)務場景:
1.進入設置
2.從坐標(148,659)滑動到坐標(148,248)
- 業(yè)務場景:
-
代碼實現(xiàn):
# 滑動沒有持續(xù)時間 driver.swipe(188,659,148,248) # 滑動持續(xù)5秒的時間 driver.swipe(188,659,148,248,5000)
8.3. scroll滑動事件
?? 從一個元素滑動到另一個元素,直到頁面自動停止
方法:scroll(origin_el, destination_el)
參數(shù):
1.origin_el:滑動開始的元素
2.destination_el:滑動結(jié)束的元素業(yè)務場景:
1.進入設置頁
2.模擬手指從存儲菜單位置 到 WLAN菜單位置的上滑操作-
代碼實現(xiàn):
# 定位到存儲菜單欄 el1 = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]") # 定位到WLAN菜單欄 el2 = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]") # 執(zhí)行滑動操作 driver.scroll(el1,el2)
8.4. drag拖拽事件
?? 從一個元素滑動到另一個元素,第二個元素替代第一個元素原本屏幕上的位置
方法:drag_and_drop(origin_el, destination_el)
參數(shù):
1.origin_el:滑動開始的元素
2.destination_el:滑動結(jié)束的元素業(yè)務場景:
1.進入設置頁
2.模擬手指將存儲菜單 滑動到 WLAN菜單欄位置-
代碼實現(xiàn):
# 定位到存儲菜單欄 el1 = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]") # 定位到WLAN菜單欄 el2 = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]") # 執(zhí)行滑動操作 driver.drag_and_drop(el1,el2)
8.5. 應用置于后臺事件
APP放置后臺奏赘,模擬熱啟動
方法:background_app(seconds)
參數(shù):
1.seconds:停留在后臺的時間寥闪,單位:秒業(yè)務場景:
1.進入設置頁
2.將APP置于后臺5s-
代碼實現(xiàn):
driver.background_app(5)
-
效果:
app置于后臺5s后,再次展示當前頁面
九磨淌、APP模擬手勢高級操作
TouchAction是AppiumDriver的輔助類疲憋,主要針對手勢操作,比如滑動梁只、長按缚柳、拖動等,原理是將一系列的動作放在一個鏈條中發(fā)送到服務器敛纲,服務器接受到該鏈條后喂击,解析各個動作,逐個執(zhí)行淤翔。
9.1. 前置代碼
from appium import webdriver
# server 啟動參數(shù)
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)
?? 所有手勢都要通過執(zhí)行函數(shù)才會運行.
9.2. 手指輕敲操作
模擬手指輕敲一下屏幕操作
方法:tap(element=None, x=None, y=None)
方法:perform() # 發(fā)送命令到服務器執(zhí)行操作
參數(shù):
1.element:被定位到的元素
2.x:相對于元素左上角的坐標翰绊,通常會使用元素的X軸坐標
3.y:通常會使用元素的Y軸坐標業(yè)務場景:
1.進入設置
2.點擊WLAN選項-
代碼實現(xiàn):
# 通過元素定位方式敲擊屏幕 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() # 結(jié)束動作旁壮,手指離開屏幕
參數(shù):
1.element:被定位到的元素
2.x:通常會使用元素的X軸坐標
3.y:通常會使用元素的Y軸坐標業(yè)務場景:
1.進入設置
2.點擊WLAN選項-
代碼實現(xiàn):
# 通過元素定位方式按下屏幕 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)
參數(shù):
ms:暫停的毫秒數(shù)業(yè)務場景:
1.進入設置
2.點擊WLAN選項
3.長按WiredSSID選項5秒-
代碼實現(xiàn):
# 點擊WLAN driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]").click() # 定位到WiredSSID el =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)
參數(shù):
1.element:被定位到的元素
2.x:通常會使用元素的X軸坐標
3.y:通常會使用元素的Y軸坐標
4.duration:持續(xù)時間,默認為1000ms業(yè)務場景:
1.進入設置
2.點擊WLAN選項
3.長按WiredSSID選項5秒-
代碼實現(xiàn):
# 點擊WLAN driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]").click() # 定位到WiredSSID el =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)
參數(shù):
1.el:定位的元素
2.x:相對于前一個元素的X軸偏移量
3.y:相對于前一個元素的Y軸偏移量業(yè)務場景1:
1.進入設置
2.向上滑動屏幕-
代碼實現(xiàn):
# 定位到存儲 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實際調(diào)用的是swip方法裁奇,可在log中查詢,不要給相對坐標麦撵。
業(yè)務場景2:
1.進入設置
2.向上滑動屏幕到可見"安全"選項
3.進入到安全
4.點擊屏幕鎖定方式
5.點擊圖案
6.繪制圖案-
代碼實現(xiàn):
# 定位到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(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. 前置代碼
from appium import webdriver
# server 啟動參數(shù)
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
-
代碼實現(xiàn):
# 獲取當前手機的時間 print(driver.device_time)
-
執(zhí)行結(jié)果:
Wed Dec 27 08:52:45 EST 2017
10.3. 獲取手機的寬高
獲取手機的寬高惫撰,可以根據(jù)寬高做一些坐標的操作
- 方法:get_window_size()
- 代碼實現(xiàn):
print(driver.get_window_size())
- 執(zhí)行結(jié)果:
{'height': 800, 'width': 480}
10.4. 發(fā)送鍵到設備
模擬系統(tǒng)鍵值的操作,比如操作home鍵躺涝,音量鍵,返回鍵等厨钻。
參數(shù):
keycode:發(fā)送給設備的關鍵代碼
metastate:關于被發(fā)送的關鍵代碼的元信息,一般為默認值業(yè)務場景:
1.打開設置
2.按多次音量增加鍵-
代碼實現(xiàn):
for i in range(3): driver.keyevent(24)
Appium---Android的keycode鍵值
adb命令使用
adb shell input keyevent XX(EventCode) #輸入對應的鍵值
adb shell input text "www.baidu.com" #向瀏覽器發(fā)送文本
EventCode | KeyEvent | EventName |
---|---|---|
0 | KEYCODE_UNKNOWN | 未知鍵 |
1 | KEYCODE_SOFT_LEFT | 左鍵 |
2 | KEYCODE_SOFT_RIGHT | 右鍵 |
3 | KEYCODE_HOME | Home鍵 |
4 | KEYCODE_BACK | 返回鍵 |
5 | KEYCODE_CALL | 撥號鍵 |
6 | KEYCODE_ENDCALL | 掛機鍵 |
7 | KEYCODE_0 | 按鍵“0” |
8 | KEYCODE_1 | 按鍵“1” |
9 | KEYCODE_2 | 按鍵“2” |
10 | KEYCODE_3 | 按鍵“3” |
11 | KEYCODE_4 | 按鍵“4” |
12 | KEYCODE_5 | 按鍵“5” |
13 | KEYCODE_6 | 按鍵“6” |
14 | KEYCODE_7 | 按鍵“7” |
15 | KEYCODE_8 | 按鍵“8” |
16 | KEYCODE_9 | 按鍵“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 | 按鍵“A” |
30 | KEYCODE_B | 按鍵“B” |
31 | KEYCODE_C | 按鍵“C” |
32 | KEYCODE_D | 按鍵“D” |
33 | KEYCODE_E | 按鍵“E” |
34 | KEYCODE_F | 按鍵“F” |
35 | KEYCODE_G | 按鍵“G” |
36 | KEYCODE_H | 按鍵“H” |
37 | KEYCODE_I | 按鍵“I” |
38 | KEYCODE_J | 按鍵“J” |
39 | KEYCODE_K | 按鍵“K” |
40 | KEYCODE_L | 按鍵“L” |
41 | KEYCODE_M | 按鍵“M” |
42 | KEYCODE_N | 按鍵“N” |
43 | KEYCODE_O | 按鍵“O” |
44 | KEYCODE_P | 按鍵“P” |
45 | KEYCODE_Q | 按鍵“Q” |
46 | KEYCODE_R | 按鍵“R” |
47 | KEYCODE_S | 按鍵“S” |
48 | KEYCODE_T | 按鍵“T” |
49 | KEYCODE_U | 按鍵“U” |
50 | KEYCODE_V | 按鍵“V” |
51 | KEYCODE_W | 按鍵“W” |
52 | KEYCODE_X | 按鍵“X” |
53 | KEYCODE_Y | 按鍵“Y” |
54 | KEYCODE_Z | 按鍵“Z” |
55 | KEYCODE_COMMA | 按鍵“,” |
56 | KEYCODE_PERIOD | 按鍵‘.’ |
57 | KEYCODE_ALT_LEFT | 組合鍵 Alt+Left |
58 | KEYCODE_ALT_RIGHT | 組合鍵 Alt+Right |
59 | KEYCODE_SHIFT_LEFT | 組合鍵 Shift+Left |
60 | KEYCODE_SHIFT_RIGHT | 組合鍵 Shift+Left |
61 | KEYCODE_TAB | 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 | 按鍵Number modifier |
79 | KEYCODE_HEADSETHOOK | 按鍵Headset Hook |
80 | KEYCODE_FOCUS | 拍照對焦鍵 |
81 | KEYCODE_PLUS | 按鍵‘+’ |
82 | KEYCODE_MENU | 菜單鍵 |
83 | KEYCODE_NOTIFICATION | 通知鍵 |
84 | KEYCODE_SEARCH | 搜索鍵 |
85 | TAG_LAST_KEYCODE |
10.5. 操作手機通知欄
打開手機的通知欄坚嗜,可以獲取通知欄的相關信息和元素操作
- 方法:open_notifications()
- 業(yè)務場景:
1.啟動設置
2.打開通知欄 - 代碼實現(xiàn):
driver.open_notifications()
10.6. 獲取手機當前網(wǎng)絡
獲取手機當前連接的網(wǎng)絡
- 方法:network_connection
- 業(yè)務場景:獲取手機當前網(wǎng)絡模式
- 代碼實現(xiàn):
print(driver.network_connection)
- 執(zhí)行結(jié)果:
6
Value (Alias) | Data | Wifi | Airplane Mode |
---|---|---|---|
0 (None) | 0 | 0 | 0 |
1 (Airplane Mode) | 0 | 0 | 1 |
2 (Wifi only) | 0 | 1 | 0 |
4 (Data only) | 1 | 0 | 0 |
6 (All network on) | 1 | 1 | 0 |
10.7. 設置手機網(wǎng)絡
更改手機的網(wǎng)絡模式夯膀,模擬特殊網(wǎng)絡情況下的測試用例
- 方法:set_network_connection(connectionType)
- 參數(shù):
connectionType:需要被設置成為的網(wǎng)絡類型 - 業(yè)務場景:
1.啟動設置
2.設置手機網(wǎng)絡為飛行模式 - 代碼實現(xiàn):
driver.set_network_connection(1)
10.8. 手機截圖
截取手機當前屏幕,保存指定格式圖片到設定位置
方法:get_screenshot_as_file(filename)
參數(shù):
filename:指定路徑下苍蔬,指定格式的圖片.業(yè)務場景:
1.打開設置頁面
2.截圖當前頁面保存到當前目錄诱建,命名為screen.png-
代碼實現(xiàn):
import os driver.get_screenshot_as_file(os.getcwd() + os.sep + './screen.png')
執(zhí)行結(jié)果:
當前目錄下會生成screen.png文件
十一、腳本錄制
11.1. 認識界面
11.2. 點擊開始錄制按鍵開始錄制腳本
點擊頂部導航欄左側(cè)第一個“選擇元素”按鍵選定搜索欄银室,然后點擊右邊點“點擊”按鍵進行操作(錄制過程就是先選擇錄制窗口左邊的APP元素涂佃,然后錄制窗口右邊的操作方式)。
錄制完成后點擊“停止錄制”按鍵蜈敢,錄制窗口右上角會同步顯示操作代碼辜荠,選擇代碼類型,將模板代碼轉(zhuǎn)換成正式代碼抓狭,復制代碼到Pycharm伯病。
代碼復制到pycharm后,最好是在每個操作或者頁面切換處加上等待時間否过,否則會因為網(wǎng)速午笛、APP設計問題或者其他原因,無法及時到達下一個頁面苗桂,導致APPIUM無法獲取頁面元素而定位元素失敗药磺,在pycharm運行時報錯煤伟。代碼編輯好后點擊pycharm的運行按鍵癌佩,APPium就會在手機上面自動運行腳本了。