APP移動(dòng)端測(cè)試高級(jí)

一、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 如何使用

  1. 進(jìn)入SDK目錄下的tools目錄,打開(kāi)uiautomatorviewer
  2. 電腦連接真機(jī)或打開(kāi)android模擬器
  3. 啟動(dòng)待測(cè)試app
  4. 點(diǎn)擊uiautomatorviewer的左上角Device Screenshot,會(huì)生成app當(dāng)前頁(yè)面的UI控件截圖
  5. 選擇截圖上需要查看的控件署咽,即可瀏覽該控件的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常用屬性定位:

    1. id ://*contains(@resource-id,'[com.android.settings:id/search')]
    2. class ://*[contains(@class,'android.widget.ImageButton')]
    3. 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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盐须,隨后出現(xiàn)的幾起案子玩荠,更是在濱河造成了極大的恐慌,老刑警劉巖贼邓,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶冈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡塑径,警方通過(guò)查閱死者的電腦和手機(jī)女坑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晓勇,“玉大人堂飞,你說(shuō)我怎么就攤上這事“笤郏” “怎么了绰筛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)描融。 經(jīng)常有香客問(wèn)我铝噩,道長(zhǎng),這世上最難降的妖魔是什么窿克? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任骏庸,我火速辦了婚禮,結(jié)果婚禮上年叮,老公的妹妹穿的比我還像新娘具被。我一直安慰自己,他們只是感情好只损,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布一姿。 她就那樣靜靜地躺著,像睡著了一般跃惫。 火紅的嫁衣襯著肌膚如雪叮叹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天爆存,我揣著相機(jī)與錄音蛉顽,去河邊找鬼。 笑死先较,一個(gè)胖子當(dāng)著我的面吹牛携冤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闲勺,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼噪叙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了霉翔?” 一聲冷哼從身側(cè)響起睁蕾,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎债朵,沒(méi)想到半個(gè)月后子眶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡序芦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年臭杰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谚中。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渴杆,死狀恐怖寥枝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情磁奖,我是刑警寧澤囊拜,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站比搭,受9級(jí)特大地震影響冠跷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜身诺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一蜜托、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霉赡,春花似錦橄务、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至迫肖,卻和暖如春锅劝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蟆湖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工故爵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隅津。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓诬垂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伦仍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子结窘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一、Appium介紹 Appium是一個(gè)移動(dòng)端的自動(dòng)化框架充蓝,可用于測(cè)試原生應(yīng)用隧枫、移動(dòng)網(wǎng)頁(yè)應(yīng)用和混合型應(yīng)用,且是跨平...
    Anwfly閱讀 2,674評(píng)論 2 7
  • 一谓苟、Appium介紹 Appium是一個(gè)移動(dòng)端的自動(dòng)化框架官脓,可用于測(cè)試原生應(yīng)用、移動(dòng)網(wǎng)頁(yè)應(yīng)用和混合型應(yīng)用涝焙,且是跨平...
    九櫻MOL閱讀 946評(píng)論 0 0
  • appium介紹 appium是一個(gè)移動(dòng)端的自動(dòng)化框架卑笨,可用測(cè)試原生應(yīng)用,移動(dòng)網(wǎng)頁(yè)應(yīng)用仑撞,和混合型應(yīng)用赤兴,且是跨平臺(tái)的...
    楷0105閱讀 249評(píng)論 0 0
  • 一妖滔、Appium介紹 Appium是一個(gè)移動(dòng)端的自動(dòng)化框架,可用于測(cè)試原生應(yīng)用桶良、移動(dòng)網(wǎng)頁(yè)應(yīng)用和混合型應(yīng)用座舍,且是跨平...
    遺憾與人海中閱讀 304評(píng)論 0 0
  • 知識(shí)概覽 一、 移動(dòng)端測(cè)試是什么 移動(dòng)端測(cè)試是指對(duì)移動(dòng)應(yīng)用進(jìn)行的測(cè)試艺普,即實(shí)體的特性滿足需求的程度簸州。 二鉴竭、 移動(dòng)端測(cè)...
    __65a0閱讀 1,863評(píng)論 1 10