ATX 使用 Python 庫 facebook-wda 完成網易雲音樂 iOS 客戶端的自動化測試

簡介

facebook-wda是ATX項目下面的一個子庫,專門提供iOS應用的自動化測試,可以通過ATX使用這個庫,當然也可以單獨拿來使用。

這篇文章介紹瞭如何用facebook-wda這個python庫來完成一個普通App應用的測試,希望通過這個篇文章,能讓iOS的測試或開發人員,更方便的迴歸測試自己的應用。開發出質量更高的應用。

選用 網易雲音樂 作爲被測應用,純粹是因爲我平常用網易雲音樂聽歌比較多,比較喜歡這款應用

facebook-wda簡要說明

facebook-wda這個Python庫,通過直接構造HTTP請求直接跟WebDriverAgent通信。它是一個非常短小精悍的一個庫,並不像appium、macaca還有一箇中間轉發服務,支持這麼多的語言。用它做測試,Python你必須要會
雖然代碼比較精煉,但是能完成的功能卻非常強大。你能在appium裏面找到的功能,這個庫有提供,找不到的功能,這個庫也有提供。

安裝準備

在寫代碼之後,你需要把下面列的東西都準備好。

  1. 部署WebDriverAgent https://testerhome.com/topics/7220

    成功安裝後,瀏覽器訪問 http://localhost:8100/status會看到一個json字符串

  2. 安裝Python庫(目前這個版本的庫支持py2.7~3.5之間的版本)

    pip install --pre facebook-wda
    

小試牛刀:完成網易雲音樂的自動登陸

手機上先安裝上一個網易雲音樂

通過ideviceinstaller -l 或者其他工具查找到網易雲音樂的bundleId com.netease.cloudmusic

網易帳號我先用兩個靜態變量代替 USERNAMEPASSWORD

先貼一段代碼,看註釋理解的比較快一些

首先是設備連接和彈窗處理

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章