Appium+Python3+Android入門

前言:

Appium 是一個自動化測試開源工具雇锡,支持 iOS 平臺和 Android 平臺上的原生應(yīng)用,web 應(yīng)用和混合應(yīng)用僚焦。


一锰提、環(huán)境配置

1、安裝Node.js

https://nodejs.org/

2、安裝Appium

http://appium.io/

3立肘、安裝Android SDK

http://tools.android-studio.org/index.php/sdk

4边坤、安裝Python-client

pip3 install Appium-Python-Client

5、安裝Appium-client

npm install wd

最后谅年,打開命令行茧痒,輸入“appium-doctor”命令,提示Appium所需要的各項環(huán)境準(zhǔn)備情況融蹂。


二旺订、服務(wù)關(guān)鍵字

Desired Capabilities在啟動session的時候是必須提供的。

Desired Capabilities本質(zhì)上是以key value字典的方式存放超燃,客戶端將這些鍵值對發(fā)給服務(wù)端耸峭,告訴服務(wù)端我們想要怎么測試。

desired_caps = {}

desired_caps['platformName'] ='Android'

desired_caps['platformVersion'] ='6.0.1'

desired_caps['deviceName'] ='e0bbc8b7'

desired_caps['appPackage'] ='com.ximalaya.ting.android'

desired_caps['appActivity'] ='com.ximalaya.ting.android.host.activity.WelComeActivity'

desired_caps["unicodeKeyboard"] ="True"

desired_caps["resetKeyboard"] ="True"

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

它告訴appium Server這樣一些事情:

deviceName:啟動哪種設(shè)備淋纲,是真機還是模擬器劳闹?iPhone Simulator,iPad Simulator洽瞬,iPhone Retina 4-inch本涕,Android Emulator,Galaxy S4…

automationName:使用哪種自動化引擎伙窃。appium(默認)還是Selendroid菩颖。

platformName:使用哪種移動平臺。iOS, Android, orFirefoxOS为障。

platformVersion:指定平臺的系統(tǒng)版本晦闰。例如指的Android平臺,版本為5.1鳍怨。

appActivity:待測試的app的Activity名字呻右。比如MainActivity、.Settings鞋喇。注意声滥,原生app的話要在activity前加個”.“。

appPackage:待測試的app的Java package侦香。比如com.example.android.myApp, com.android.settings落塑。

注??:aapt工具可獲取appActivity,appPackage
aapt dump badging <file.apk>
即可獲取appActivity罐韩,appPackage等~~


三憾赁、定位控件

1、ID定位

使用方法:driver.find_element_by_id(‘com.android.calculator2:id/formula’)

image

2散吵、name定位

使用方法:driver.find_element_by_name("9"))

image

3龙考、class name定位

使用方法:driver.find_element_by_class_name(“android.widget.Button"))

image

4膘壶、XPath定位

使用方法:用class的屬性來替代做標(biāo)簽的名字。

driver.find_element_by.xpath(“//android.view.ViewGroup/android.widget.Button”)

image

當(dāng)果如果出現(xiàn)class相同的情況下可以用控件的屬性值進行區(qū)分洲愤。

driver.find_element_by_xpath("http://android.widget.Button[contains(@text,'7')]").click();

driver.find_element_by_xpath(”//android.widget.Button[contains(@content-desc,’times')]").click();

driver.find_element_by_xpath("http://android.widget.Button[contains(@text,'7')]").click();

driver.ffind_element_by_xpath("http://android.widget.Button[contains(@content-desc,'equals')]").click();

XPath在Appium上的用法依然很強大颓芭,有時需要寫更臭更長的定位語法,因為APP上元素的class命令本來就長柬赐,再加上多層級亡问,結(jié)果可想而知。

5肛宋、Accessibility ID定位

使用方法:其實州藕,我們的核心是要找到元素的contentDescription屬性。它就是元素的content-desc酝陈。

driver.find_element_by_accessibility_id("plus").click();

image

6床玻、android uiautomator定位

使用方法:

一個元素的任意屬性都可以通過android uiautomator方法來進行定位,但要保證這種定位方式的唯一性沉帮。

driver.find_element_by_android_uiautomator("new UiSelector().text(\”8\")").click();

driver.find_element_by_android_uiautomator("new UiSelector().description(\”plus\")").click();

image

四锈死、應(yīng)用操作

1、安裝應(yīng)用

install_app()

安裝應(yīng)用到設(shè)備中去穆壕。需要apk包的路徑待牵。

2、卸載應(yīng)用

remove_app()

從設(shè)備中刪除一個應(yīng)用喇勋。

3缨该、關(guān)閉應(yīng)用

close_app()

關(guān)閉打開的應(yīng)用,默認關(guān)閉當(dāng)前打開的應(yīng)用川背,所以不需要入?yún)⒎∧谩_@個方法并非真正的關(guān)閉應(yīng)用,相當(dāng)于按home鍵將應(yīng)用置于后臺熄云,可以通過launchApp()再次啟動膨更。

4、啟動應(yīng)用

launch_app()

啟動應(yīng)用皱碘。你一定很迷惑询一,不是在初始化的配置信息已經(jīng)指定了應(yīng)用隐孽,腳本運行的時候就需要啟動應(yīng)用癌椿,為什么還要有這個方法去啟動應(yīng)用呢?重新啟動應(yīng)用也是一個測試點菱阵,該方法需要配合closeApp()使用的踢俄。

5、檢查應(yīng)用是否安裝

is_app_installed()

檢查應(yīng)用是否已經(jīng)安裝晴及。需要傳參應(yīng)用包的名字都办。返回結(jié)果為Ture或False。

6、將應(yīng)用置于后臺

background_app()

將當(dāng)前活躍的應(yīng)用程序發(fā)送到后臺琳钉。這個方法需要入?yún)⑹颇荆枰付☉?yīng)用置于后臺的時長。

7歌懒、應(yīng)用重置

reset()

重置當(dāng)前被測程序到出始化狀態(tài)啦桌。該方法不需要入?yún)ⅰ?/p>


五、鍵盤操作

1及皂、SendKeys()方法

driver.find_element_by_name(“Name”).send_keys("jack");

2甫男、PressKeyCode()方法

除此之外,Appium擴展提供了pressKeyCode()方法验烧。該方法Android特有板驳。

發(fā)送一個鍵碼的操作。(鍵碼對照表請自行百度碍拆,此處不展示了若治。)

driver.press_keycode(3)//點擊Android的HOME鍵

driver.press_keycode(27)//點擊拍照鍵

3、輸入法問題:

必須使用appium自帶鍵盤感混,并添加:

desired_caps["unicodeKeyboard"] = "True"

desired_caps["resetKeyboard"] = "True"


六直砂、TouchAction操作

Appium的輔助類,主要針對手勢操作浩习,比如滑動静暂、長按、拖動等谱秽。

1洽蛀、按壓控件press()

開始按壓一個元素或坐標(biāo)點(x,y)。通過手指按壓手機屏幕的某個位置疟赊。

press(WebElement el, int x, int y)

2郊供、長按控件longPress()

開始按壓一個元素或坐標(biāo)點(x,y)。相比press()方法近哟,longPress()多了一個入?yún)⑼陨螅热婚L按,得有按的時間吧吉执。duration以毫秒為單位疯淫。1000表示按一秒鐘。其用法與press()方法相同戳玫。

longPress(WebElement el, int x, int y, Duration duration)

3熙掺、點擊控件tap()

對一個元素或控件執(zhí)行點擊操作。用法參考press()咕宿。

tap(WebElement el, int x, int y)

4币绩、移動moveTo()

將指針(光標(biāo))從過去指向指定的元素或點蜡秽。

moveTo(WebElement el, int x, int y)

5、暫停wait()

暫停腳本的執(zhí)行缆镣,單位為毫秒芽突。

action.wait(1000);


七、其他操作

其它操作針對移動設(shè)備上特有的一些操作董瞻。

1诉瓦、熄屏

方法:lock()

點擊電源鍵熄滅屏幕。[iOS專有,可以設(shè)置熄屏?xí)r間]

driver.lock(1000);// iOS

2力细、收起鍵盤

方法:hide_keyboard()

收起鍵盤睬澡,這個方法很有用,當(dāng)我們對一個輸入框輸入完成后眠蚂,需要將鍵盤收起煞聪,再切換到一下輸入框進行輸入。

driver.hide_keyboard();//收起鍵盤

3逝慧、滑動

方法:swipe()

模擬用戶滑動昔脯。將控件或元素從一個位置(x,y)拖動到另一個位置(x,y)。

swipe(int startx, int starty, int endx, int endy, int duration)

* start_x:開始滑動的x坐標(biāo)笛臣。* start_y:開始滑動的y坐標(biāo)云稚。

* end_x:結(jié)束滑動的x坐標(biāo)。* end_y:結(jié)束滑動的y坐標(biāo)沈堡。

* duration:持續(xù)時間静陈。

例:driver.swipe(75, 500, 75, 0, 800);

4、截屏

方法:get_screenshot_as_file()

用法:driver.get_screenshot_as_file('../screenshot/foo.png'),參數(shù)為保存的圖片路徑和名稱

5诞丽、獲取控件各種屬性

方法:get_attribute()

用法:

driver.find_element_by_id().get_attribute(name)鲸拥,

name即是左側(cè)的標(biāo)志(class,package僧免,checkable刑赶,checked....),

可獲取的字符串類型:

name(返回content-desc或text)

text(返回text)

className(返回class懂衩,只有API=>18才能支持)

resourceId(返回resource-id撞叨,只有API=>18才能支持)

八、unittest之?dāng)嘌?/h4>

在unittest單元測試框架中浊洞,TestCase類提供了一些方法來檢查并報告故障:

assertEqual(first, second, msg=None)

判斷first和second的值是否相等牵敷,如果不相等則測試失敗,msg用于定義失敗后所拋出的異常信息沛申。

assertNotEqual(first, second, msg=None)

測試first和second不相等劣领,如果相等,則測試失敗铁材。

assertTure(expr,msg=None)

assertFalse(expr,msg=None)

測試expr為Ture(或為False)

assertIs(first, second, msg=None)

assertIsNot(first, second, msg=None)

測試的first和second是(或不是)相同的對象尖淘。

assertIsNone(expr, msg=None)

assertIsNotNone(expr, msg=None)

測試expr是(或不是)為None

assertIn(first, second, msg=None)

assertNotIn(first, second, msg=None)

測試first是(或不是)在second中。second包含是否包含first著觉。


九村生、實例代碼(例子app:喜馬拉雅FM)

import os

import unittest

from appium import webdriver

from time import sleep

# Returns abs path relative to this file and not cwd

PATH =lambdap: os.path.abspath(

os.path.join(os.path.dirname(__file__), p)

)

class Contacts Android Tests(unittest.TestCase):

def setUp(self): 

desired_caps = {}

desired_caps['platformName'] ='Android'

desired_caps['platformVersion'] ='6.0.1'

desired_caps['deviceName'] ='e0bbc8b7'

desired_caps['appPackage'] ='com.ximalaya.ting.android'

desired_caps['appActivity'] ='com.ximalaya.ting.android.host.activity.WelComeActivity'

desired_caps["unicodeKeyboard"] ="True"

desired_caps["resetKeyboard"] ="True"

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

sleep(6)

def tearDown(self):

self.driver.close_app()

self.driver.quit()

deftest_Login(self):

self.driver.find_element_by_id('com.ximalaya.ting.android:id/tab_myspace').click()

sleep(2)

self.driver.find_element_by_accessibility_id('設(shè)置').click()

sleep(2)

width =self.driver.get_window_size()['width']

height =self.driver.get_window_size()['height']

self.driver.swipe(width /2, height *7/8, width /2, height *4/8,1000)

# 不同的手機分辨率不同,所以一個坐標(biāo)如果用另一個分辨率不同的手機可能位置就有所變化了饼丘,為了讓apppium 更好的兼容不同分辨率的設(shè)備趁桃,

# 在執(zhí)行滑動前先獲取屏幕的分辨率。

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_tv_login').click()

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_username').send_keys('18500425217')

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_password').send_keys('wj1234')

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_login').click()

sleep(4)

text =self.driver.find_element_by_id('com.ximalaya.ting.android:id/tab_myspace').text

self.assertEqual(text,'我的')

deftest_Search(self):

sleep(3)

message =self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_item_finding_title').text

self.assertEqual(message,'天天好書')

self.driver.find_element_by_accessibility_id("搜索").click()

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_search_et').send_keys('段子')

self.driver.find_element_by_id('com.ximalaya.ting.android:id/main_search_button').click()

self.driver.get_screenshot_as_file('/Users/wangjuan/截圖圖庫/1.jpg')

self.driver.press_keycode(4)

self.assertEqual(message,'天天好書')

if__name__ =='__main__':

suite = unittest.TestLoader().loadTestsFromTestCase(ContactsAndroidTests)

unittest.TextTestRunner(verbosity=2).run(suite)

以上肄鸽,希望對你有所幫助~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卫病,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子典徘,更是在濱河造成了極大的恐慌蟀苛,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逮诲,死亡現(xiàn)場離奇詭異帜平,居然都是意外死亡,警方通過查閱死者的電腦和手機梅鹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門裆甩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人齐唆,你說我怎么就攤上這事嗤栓。” “怎么了箍邮?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵抛腕,是天一觀的道長。 經(jīng)常有香客問我媒殉,道長担敌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任廷蓉,我火速辦了婚禮全封,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桃犬。我一直安慰自己刹悴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布攒暇。 她就那樣靜靜地躺著土匀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪形用。 梳的紋絲不亂的頭發(fā)上就轧,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天证杭,我揣著相機與錄音,去河邊找鬼妒御。 笑死解愤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乎莉。 我是一名探鬼主播送讲,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惋啃!你這毒婦竟也來了哼鬓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤边灭,失蹤者是張志新(化名)和其女友劉穎异希,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體存筏,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡宠互,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椭坚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片予跌。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖善茎,靈堂內(nèi)的尸體忽然破棺而出券册,到底是詐尸還是另有隱情,我是刑警寧澤垂涯,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布烁焙,位于F島的核電站,受9級特大地震影響耕赘,放射性物質(zhì)發(fā)生泄漏骄蝇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一操骡、第九天 我趴在偏房一處隱蔽的房頂上張望九火。 院中可真熱鬧,春花似錦册招、人聲如沸岔激。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谋右,卻和暖如春货矮,著一層夾襖步出監(jiān)牢的瞬間炫彩,已是汗流浹背匾七。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留媒楼,地道東北人乐尊。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓戚丸,卻偏偏與公主長得像划址,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子限府,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

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