appium+python(一)

目錄




安卓主流的自動(dòng)化測(cè)試框架及對(duì)比.................................... 2

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

環(huán)境搭建.............................................................................. 3

Appium使用實(shí)例................................................................. 7

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


安卓主流的自動(dòng)化測(cè)試框架及對(duì)比

當(dāng)前主流的幾大自動(dòng)化測(cè)試框架及工具有:

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

其中適用的范圍如下:

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

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

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

?Monkey (壓力測(cè)試)

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

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

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

Appium工具介紹

Appium測(cè)試相當(dāng)于黑盒測(cè)試,主要測(cè)試UI邏輯正確性。同時(shí),也可作為自動(dòng)化回歸使用。

Appium的優(yōu)勢(shì):

采用Appium時(shí),無需對(duì)被測(cè)應(yīng)用做任何修改;Appium對(duì)iOS和Android的原生自動(dòng)化測(cè)試框架進(jìn)行了封裝,并提供了統(tǒng)一的API(WebDriver API),減少了自動(dòng)化測(cè)試代碼的維護(hù)工作量;Appium采用Client-Server的架構(gòu)設(shè)計(jì),并采用標(biāo)準(zhǔn)的HTTP通信協(xié)議;Server端負(fù)責(zé)與iOS/Android原生測(cè)試框架交互,無需測(cè)試人員關(guān)注細(xì)節(jié)實(shí)現(xiàn);Client端基本上可以采用任意主流編程語言編寫測(cè)試用例,減少了學(xué)習(xí)成本。

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


環(huán)境搭建

Android測(cè)試開發(fā)環(huán)境配置:

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

是否安裝成功檢查:

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


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

是否安裝成功檢查:

打開cmd,輸入adb ,顯示:

連接手機(jī):

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

Appium環(huán)境配置:

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

是否安裝成功檢查:

打開cmd,輸入python,顯示:

安裝node.js

下載官網(wǎng):https://nodejs.org/en/download/23

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

出現(xiàn)下圖信息后,表示node.js安裝成功


安裝appium

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

直接雙擊appium-installer.exe文件安裝就好,桌面會(huì)生成一個(gè)appium的圖標(biāo),啟動(dòng)后界面顯示如下:

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

2.將上面的地址添加到環(huán)境變量path下

3.打卡cmd,輸入appium-doctor,檢查環(huán)境是否OK,出現(xiàn)如下圖所示,說明環(huán)境OK



Python開發(fā)環(huán)境:

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


Appium使用實(shí)例

啟動(dòng)app

啟動(dòng)app需要獲取到所測(cè)試的包名及l(fā)auncherActivity,獲取的方法很多,比如上一次介紹的當(dāng)前Activity那個(gè)軟件,可以獲取到;這次介紹一個(gè)新的,sdk自帶的工具aapt來獲取它的包名及l(fā)auncherActivity。

aapt即Android Asset

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

打開cmd,輸入aapt:下圖表示環(huán)境已經(jīng)OK了

獲取apk的包名及l(fā)auncherActivity

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

起始腳本:

# coding=utf-8

from appium import webdriver

import time

import unittest? # 導(dǎo)入unittest框架,此文用到了斷言

import zidian? ? # 導(dǎo)入字典包

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設(shè)置中server的地址

Appium的相關(guān)配置如下(點(diǎn)擊第一個(gè)安卓機(jī)器人的圖標(biāo))


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

在pycharm上運(yùn)行腳本(確保手機(jī)已連接上電腦)

隨后在手機(jī)上會(huì)彈出安裝下面兩個(gè)軟件的提示,安裝后,桌面上多兩個(gè)圖標(biāo)。那么恭喜你啟動(dòng)成功!

接著就能看到我們app啟動(dòng)啦!?。〉酱藶橹?,環(huán)境已經(jīng)完全通了,接下來就是編寫測(cè)試用例(腳本)的時(shí)候了。

腳本例子

此腳本實(shí)現(xiàn)的功能:(從字典中獲取手機(jī)號(hào)及密碼,登錄app,并對(duì)結(jié)果頁面進(jìn)行斷言)該腳本中會(huì)有很多我編寫時(shí)候的遇到的一些問題所對(duì)應(yīng)的解決辦法的注釋,注釋是精華哈哈?。e忽略了!

源碼:

# coding=utf-8

from appium import webdriver

import time

import unittest? # 導(dǎo)入unittest框架,此文用到了斷言

import zidian? ? # 導(dǎo)入字典包

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的第一個(gè)BB子元素,所以下方的腳本意思是:選擇TabHost

# 的第二個(gè)LinearLayout的第四個(gè)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("資產(chǎn)")'

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)

# 輸入手機(jī)號(hào)? 數(shù)據(jù)字典

'''

創(chuàng)建字典用大括號(hào),數(shù)據(jù)由 key/value 鍵值對(duì)組成,keys()方法返回字典中的鍵列表。

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

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

通過.items()循環(huán)讀取元組(鍵/值對(duì))

通過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!')

# 點(diǎn)擊下一步

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!')

# 對(duì)登錄結(jié)果手機(jī)號(hào)進(jìn)行斷言

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

print(phone)

# 添加斷言,若手機(jī)號(hào)不正確,則打印錯(cuò)誤信息

# 斷言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 本身是一個(gè)python的測(cè)試框架,他有他自己的使用規(guī)則;

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("資產(chǎn)")'

print(id_text)

driver.find_element_by_android_uiautomator(id_text).click()

time.sleep(2)

# 通過resourceId的 兄弟關(guān)系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的父子關(guān)系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)

# 關(guān)閉app應(yīng)用程序

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? # 導(dǎo)入unittest框架,此文用到了斷言

import zidian? ? # 導(dǎo)入字典包

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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言: Appium Python API全集,不知道哪個(gè)大神整理的,這里貼出來分享給大家。 1.contex...
    Roshan_閱讀 2,035評(píng)論 0 5
  • 1.contexts contexts(self): Returns the contexts within th...
    七月尾巴_葵花閱讀 2,287評(píng)論 0 10
  • 端午節(jié)接到表哥電話,說要同表嫂、侄女一起來玩。 表哥李小兵,是妻子的表哥。表哥和妻子是四川廣元人,2000年我同妻...
    三峽纖夫閱讀 429評(píng)論 7 1
  • 我也不知道是宅總對(duì)待友情與愛情的態(tài)度 或是李四的完美大叔氣質(zhì) 還是Carter對(duì)正義與忠誠(chéng)的詮釋 Root對(duì)mac...
    魚子醬xi閱讀 387評(píng)論 1 4
  • 混日子的人很多。有人在混日子卻不自知,有人自知卻懶于自救,有人掙扎卻不得其法,有人明知在混日子卻混得心安理得。 ...
    零零魚閱讀 1,229評(píng)論 10 21

友情鏈接更多精彩內(nèi)容