簡介
facebook-wda是ATX項目下面的一個子庫,專門提供iOS應用的自動化測試,可以通過ATX使用這個庫,當然也可以單獨拿來使用。
這篇文章介紹瞭如何用facebook-wda這個python庫來完成一個普通App應用的測試,希望通過這個篇文章,能讓iOS的測試或開發人員,更方便的迴歸測試自己的應用。開發出質量更高的應用。
選用 網易雲音樂 作爲被測應用,純粹是因爲我平常用網易雲音樂聽歌比較多,比較喜歡這款應用
facebook-wda簡要說明
facebook-wda這個Python庫,通過直接構造HTTP請求直接跟WebDriverAgent通信。它是一個非常短小精悍的一個庫,並不像appium、macaca還有一箇中間轉發服務,支持這麼多的語言。用它做測試,Python你必須要會。
雖然代碼比較精煉,但是能完成的功能卻非常強大。你能在appium裏面找到的功能,這個庫有提供,找不到的功能,這個庫也有提供。
安裝準備
在寫代碼之後,你需要把下面列的東西都準備好。
-
部署WebDriverAgent https://testerhome.com/topics/7220
成功安裝後,瀏覽器訪問
http://localhost:8100/status
會看到一個json字符串 -
安裝Python庫(目前這個版本的庫支持py2.7~3.5之間的版本)
pip install --pre facebook-wda
小試牛刀:完成網易雲音樂的自動登陸
手機上先安裝上一個網易雲音樂
通過ideviceinstaller -l
或者其他工具查找到網易雲音樂的bundleId com.netease.cloudmusic
網易帳號我先用兩個靜態變量代替 USERNAME
, PASSWORD
先貼一段代碼,看註釋理解的比較快一些
首先是設備連接和彈窗處理
import wda
bundle_id = 'com.netease.cloudmusic'
c = wda.Client('http://localhost:8100') # DEVICE_URL
s = c.session(bundle_id) # 啓動應用
# 處理不知何時就會突然彈出的警告框
def alert_callback(session):
btns = set([u'不再提醒', 'OK', u'知道了', 'Allow', u'允許']).intersection(session.alert.buttons())
if len(btns) == 0:
raise RuntimeError("Alert can not handled, buttons: " + ', '.join(session.alert.buttons()))
session.alert.click(list(btns)[0])
s.set_alert_callback(alert_callback)
變量s
就代表wda的Session了,下面通過獲取到的Session去完成登錄
def netease_login(s):
# 已經登錄直接跳過
# 開頭有2s的廣告,所以這裏需要等待3s
if s(name=u'發現音樂', type='Button').wait(3, raise_error=False):
# Already logged in
return
# 點擊郵箱登錄,輸入帳號密碼,驗證是否登錄成功
s(name=u'網易郵箱').tap()
s(type='TextField').set_text(USERNAME+'\n')
s(type='SecureTextField').set_text(PASSWORD+'\n')
s(name=u'開啓雲音樂').click_exists(timeout=3.0)
assert s(name=u'發現音樂', type='Button').wait(5.0) # 等待5s
netease_login(s)
使用python單測框架pytest來組織測試腳本
最近用了用pytest,感覺比python自帶的unittest好用的不少。安裝方法 pip install pytest
直接上腳本(爲了節省篇幅,我就省略了比較常見的import,包括上面的那個alert_callback,實際寫代碼的時候你應該加上去)
def setup_function():
# 每次測試之前,保證帳號是登錄的
s = c.session(bundle_id)
netease_login(s)
def teardown_function():
s.close() # 一次測試結束,關閉應用
def test_discover_music():
"""
測試 發現音樂->私人FM 中的播放功能
"""
s(name=u'發現音樂', type='Button').tap() # 默認會尋找10s,所以不用擔心點不到
assert s(name=u'聽歌識曲', visible=True).wait()
s(name=u'私人FM').tap()
assert s(name=u'不再播放').exists
assert s(name=u'添加到我喜歡的音樂').exists
assert s(name=u'00:00', className='StaticText').exists
s(nameMatches=u'(暫停|播放)').tap() # 點擊播放後,按鈕會變成暫停,這裏用正則匹配下
assert s(name=u'00:00', className='StaticText').wait_gone(10.0) # 等待音樂播放,進度條開始走了
def test_my_music():
"""
測試 我的音樂->本地音樂
"""
s(name=u'我的音樂', type='Button').tap()
assert s(name=u'最近播放').wait(2.0)
s(name=u'本地音樂').tap()
assert s(name=u'管理').wait()
s(name=u'播放全部').tap()
保存文件爲 test_cloudmusic.py
,然後命令行運行測試
$ py.test -vv
============================= test session starts =============================
platform win32 -- Python 2.7.13, pytest-3.2.1, py-1.4.34, pluggy-0.4.0 -- c:\python27\python.exe
cachedir: ..\.cache
rootdir: D:\Workdir\facebook-wda, inifile:
collected 2 items
com.netease.cloudmusic\test_discover_music.py::test_discover_music PASSED
com.netease.cloudmusic\test_discover_music.py::test_my_music PASSED
========================== 2 passed in 23.19 seconds ==========================
pytest會保證調用函數test_discover_music
之前把setup_function
調用了,在測試結束後把teardown_function
調用一次。
通過這種方式可以增加更多的測試。完整示例可以再該地址查看到https://github.com/openatx/facebook-wda/tree/master/examples/com.netease.cloudmusic
PS: 該項目自身的自測代碼用的也是pytest
進一步閱讀:控件定位
通過訪問 http://localhost:8100/inspector可以獲取應用的UI圖層結構,方便寫腳本
比如我們訪問到一個控件的屬性
直接看着就可以寫出代碼 s(name=u'聽歌識曲', className='Button').tap()
除了這些簡單的定位方法還有茫茫多的定位方法。具體查看項目的主頁 https://github.com/openatx/facebook-wda 想鍛鍊下手部肌肉的,還可以順便點個Star