appium+python(一)

目錄




安卓主流的自動化測試框架及對比.................................... 2

Appium工具介紹................................................................. 2

環境搭建.............................................................................. 3

Appium使用實例................................................................. 7

腳本例子............................................................................ 13


安卓主流的自動化測試框架及對比

當前主流的幾大自動化測試框架及工具有:

Appium、Robotium、AndroidTest、Monkey、monkeyRuner、UIAutomator、MonkeyTalk

其中適用的范圍如下:

?Appium測試 (功能測試,用戶接受度測試,黑盒測試)

Robotium測試 (功能測試,用戶接受度測試,黑盒+白盒測試)

?AndroidTest (單元測試,邏輯測試,白盒測試)

?Monkey (壓力測試)

monkeyRuner (功能測試,用戶接受度測試,黑盒測試)

?UIAutomator - 官方(黑盒測試,功能測試)

MonkeyTalk (白盒測試,功能測試)

Appium工具介紹

Appium測試相當于黑盒測試,主要測試UI邏輯正確性。同時,也可作為自動化回歸使用。

Appium的優勢:

采用Appium時,無需對被測應用做任何修改;Appium對iOS和Android的原生自動化測試框架進行了封裝,并提供了統一的API(WebDriver API),減少了自動化測試代碼的維護工作量;Appium采用Client-Server的架構設計,并采用標準的HTTP通信協議;Server端負責與iOS/Android原生測試框架交互,無需測試人員關注細節實現;Client端基本上可以采用任意主流編程語言編寫測試用例,減少了學習成本。

接下來的文章,以Appium工具+python語言進行介紹。


環境搭建

Android測試開發環境配置:

jdk的安裝與配置(包括環境變量)

是否安裝成功檢查:

打開cmd,輸入java -version? 顯示版本信息


android sdk安裝與配置(包括環境變量)

是否安裝成功檢查:

打開cmd,輸入adb ,顯示:

連接手機:

手機用數據線連電腦,如果安裝了91助手或者360什么的可以先下載手機驅動,確認手機能連上,打開cmd輸入:adb devices,當屏幕上出現一串字符,后面顯示devices說明連接成功(出現其它的提示,得檢查自己的環境了)

Appium環境配置:

Python安裝與配置(包括環境變量)

是否安裝成功檢查:

打開cmd,輸入python,顯示:

安裝node.js

下載官網:https://nodejs.org/en/download/23

?? 安裝成功后,打開cmd,輸入node –v查看版本號,然后輸入npm:

出現下圖信息后,表示node.js安裝成功


安裝appium

下載地址:https://bitbucket.org/appium/appium.app/downloads/16

直接雙擊appium-installer.exe文件安裝就好,桌面會生成一個appium的圖標,啟動后界面顯示如下:

安裝好后,找到這個文件目錄D:\appium\Appium\node_modules\.bin

2.將上面的地址添加到環境變量path下

3.打卡cmd,輸入appium-doctor,檢查環境是否OK,出現如下圖所示,說明環境OK



Python開發環境:

本人使用的是PyCharm 開發工具,來編寫代碼,用起來還不錯,推薦。


Appium使用實例

啟動app

啟動app需要獲取到所測試的包名及launcherActivity,獲取的方法很多,比如上一次介紹的當前Activity那個軟件,可以獲取到;這次介紹一個新的,sdk自帶的工具aapt來獲取它的包名及launcherActivity。

aapt即Android Asset

Packaging Tool,在SDK的build-tools目錄下。需將D:\androidsdk\android-sdk-windows\build-tools\24.0.0目錄下找到aapt.exe這個路徑設置環境變量,添加到path下

打開cmd,輸入aapt:下圖表示環境已經OK了

獲取apk的包名及launcherActivity

打開cmd輸入:aapt dump badging C:\yylc.apk

起始腳本:

# coding=utf-8

from appium import webdriver

import time

import unittest? # 導入unittest框架,此文用到了斷言

import zidian? ? # 導入字典包

desired_caps = {

? ? 'platformName': 'Android',

? ? 'deviceName': '5fce0d83',

? ? 'platformVersion': '6.0.1',

? ? 'appPackage': 'com.test54320',

? ? 'appActivity': 'com.biz.launch.controller.SplashScreenActivity',

? ? # 'unicodeKeyboard': True,

? ? # 'resetKeyboard': True

}

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

上方的driver的地址,就是appium設置中server的地址

Appium的相關配置如下(點擊第一個安卓機器人的圖標)


啟動appium(三角形變成正方形,表示已啟動)

在pycharm上運行腳本(確保手機已連接上電腦)

隨后在手機上會彈出安裝下面兩個軟件的提示,安裝后,桌面上多兩個圖標。那么恭喜你啟動成功!

接著就能看到我們app啟動啦!!!到此為止,環境已經完全通了,接下來就是編寫測試用例(腳本)的時候了。

腳本例子

此腳本實現的功能:(從字典中獲取手機號及密碼,登錄app,并對結果頁面進行斷言)該腳本中會有很多我編寫時候的遇到的一些問題所對應的解決辦法的注釋,注釋是精華哈哈!!別忽略了!

源碼:

# coding=utf-8

from appium import webdriver

import time

import unittest? # 導入unittest框架,此文用到了斷言

import zidian? ? # 導入字典包

desired_caps = {

? ? 'platformName': 'Android',

? ? 'deviceName': '5fce0d83',

? ? 'platformVersion': '6.0.1',

? ? 'appPackage': 'com.test54320',

? ? 'appActivity': 'com.biz.launch.controller.SplashScreenActivity',

? ? # 'unicodeKeyboard': True,

? ? # 'resetKeyboard': True

}

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

driver.reset()

print('resetApp ok')

time.sleep(5)

# 判斷是否已安裝app

print(driver.is_app_installed("com.bench.test54317"))

time.sleep(1)

print('start')

driver.swipe(700, 700, 50, 700)

print('1')

time.sleep(1)

driver.swipe(700, 700, 50, 700)

print('2')

time.sleep(1)

driver.swipe(700, 700, 50, 700)

print('3')

time.sleep(1)

driver.find_element_by_id("com.bench.test54317:id/view_btn_go").click()

print('splash ok !')

time.sleep(3)

'''

? driver.find_element_by_xpath("http://android.widget.TabHost/android.widget.LinearLayout[contains(@index,3)]").click()

// android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[contains(@index,0)]");

# me = driver.find_element_by_xpath('//android.widget.TabHost/android.widget.LinearLayout[1]')

'''

time.sleep(1)

'''

# find_element_by_xpath中的xpath:/AA/BB[1] 的意思是:選擇AA的第一個BB子元素,所以下方的腳本意思是:選擇TabHost

# 的第二個LinearLayout的第四個FrameLayout子元素

# me = driver.find_element_by_xpath('//android.widget.TabHost/android.widget.LinearLayout[2]/'

#? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 'android.widget.FrameLayout[4]')----家里電腦ok

'''

'''

id_text = 'resourceId("com.bench.yylc.test54317:id/tv_main_tab").text("資產")'

print(id_text)

driver.find_element_by_android_uiautomator(id_text).click()

'''

me = driver.find_element_by_xpath("http://android.widget.FrameLayout/android.widget.TabHost/"

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "android.widget.LinearLayout/android.widget.RelativeLayout[4]")

print(me)

'''

# me1 = driver.find_element_by_id('com.bench.yylc.test54317:id/home_tab_wrapper')

# print(me1)

'''

me.click()

print('me? ok')

driver.find_element_by_id("com.bench.test54317:id/viewMeAccount").click()

time.sleep(2)

# 輸入手機號? 數據字典

'''

創建字典用大括號,數據由 key/value 鍵值對組成,keys()方法返回字典中的鍵列表。

values()返回字典中的值列表,items()返回(key,value)元組。

新建一個字典放在lib包中info = zidian.zidian()? 獲取字典數據

通過.items()循環讀取元組(鍵/值對)

通過info['user2']通過唯一的鍵名獲取值

'''

info = zidian.userpwd()

for us in info.items():

? ? print(us)

driver.find_element_by_id("com.bench.test54317:id/yyinput_edittext").send_keys(info['user1'])

print('input phone ok!')

# 點擊下一步

time.sleep(2)

driver.find_element_by_id("com.bench.test54317:id/login_ip_next").click()

time.sleep(2)

# 輸入密碼

driver.find_element_by_id("com.bench.test54317:id/yyinput_edittext").send_keys(info['password1'])

print('input password ok!')

# 確定按鈕

driver.find_element_by_id("com.bench.test54317:id/btn_login_ip_confirm").click()

print('login ok!')

# 對登錄結果手機號進行斷言

phone = driver.find_element_by_id('com.bench.test54317:id/txt_me_acc_phone').text

print(phone)

# 添加斷言,若手機號不正確,則打印錯誤信息

# 斷言1

try:

? ? assert '158****0001' in phone

? ? print('login is right1')

except AssertionError as e:

? ? print('login is Error1')

# 斷言2

try:

? ? assert phone == '158****0001'

? ? print('login is right2')

except AssertionError as e:

? ? print('login is Error2')

# 斷言3 (unittest)

'''

1. unittest 本身是一個python的測試框架,他有他自己的使用規則;

2. 如果用其中的方法,需要引入,方法:

import unittest

class Login(unittest.TestCase):

其中需要引入unittest,然后聲明的類需要繼承它的TestCase才可以訪問其中的方法。

'''

class test_duanyan(unittest.TestCase):

? ? ? ? def test_login(self):

? ? ? ? ? ? self.assertEqual(phone, '158****0001', 'login assert fail!')

? ? ? ? ? ? print('login duanyan3')

# 通過resourceId定位元素

id_text = 'resourceId("com.bench.test54317:id/tv_main_tab").text("資產")'

print(id_text)

driver.find_element_by_android_uiautomator(id_text).click()

time.sleep(2)

# 通過resourceId的 兄弟關系fromParent定位元素

brother = 'resourceId("com.bench.test54317:id/ic_main_tab").fromParent(text("首頁"))'

print(brother)

driver.find_element_by_android_uiautomator(brother).click()

time.sleep(2)

# 通過resourceId的父子關系childSelector定位元素

son = 'resourceId("com.bench.test54317:id/layout_main_tab").childSelector(text("我"))'

print(son)

driver.find_element_by_android_uiautomator(son).click()

time.sleep(2)

# AssertionError(Exception)

# assertThat(el.getText(),equalTo("158****0001"))

# assertThat(phone,equalTo("158****0001"))

print(driver.current_activity)

time.sleep(5)

# 關閉app應用程序

driver.close_app()

print("close ok ")

# 退出 session

driver.quit()

print("quit ok ")

if __name__ == '__main__':

? ? unittest.main()


# coding=utf-8

from appium import webdriver

import time

import unittest? # 導入unittest框架,此文用到了斷言

import zidian? ? # 導入字典包

desired_caps = {

? ? 'platformName': 'Android',

? ? 'deviceName': '5fce0d83',

? ? 'platformVersion': '6.0.1',

? ? 'appPackage': 'com.test54320',

? ? 'appActivity': 'com.biz.launch.controller.SplashScreenActivity',

? ? # 'unicodeKeyboard': True,

? ? # 'resetKeyboard': True

}

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容