atx測試框架實現手機應用UI自動化測試


  最近工作中遇到游戲APP需要實現UI自動化測試,這個app中真的是典型的混合App,有Android原生控件,有webview控件,以及游戲操作頁面。研究了Appium,發現appium實現跨應用操作很困難,研究了好幾天也沒找到實現的方法。后來在公司大佬的帶領下,接觸到了atx這個自動化的框架。今天來說一下,使用atx,uiautomator2,pytest,selenium 來實現混合App的UI自動化及生成測試報告。
一、環境准備
本人使用的是系統是Mac,所以接線來的都是在Mac電腦上進行的。
1、安裝adb,並將adb配置到環境變量中。具體請查看: https://blog.csdn.net/qq_26287435/article/details/81513649
2、安裝pytest
1 # 安裝
2 pip install -U pytest
3 # 查看安裝版本
4 pip show pytest
5 # 或者
6 pytest --version
pytest的使用方法請自行查看: https://www.jianshu.com/p/75c27fe23b4e
3、安裝uiautomator2
pip install --pre -U uiautomator2 #默認安裝最新版本
pip install uiautomator2=0.1.11#指定版本安裝
我使用的是0.1.11版本的,安裝的時候指定版本:

4. 設備安裝atx-agent
首先設備連接到PC,並能夠adb devices發現該設備。

# 從github下載atx-agent文件,並推送到手機。在手機上安裝包名為`com.github.uiautomator`的apk
$ python -m uiautomator2 init
success
看到success ,代表atx-agent初始化成功。手機上會出現一個小汽車圖標的應用。
5.安裝selenium
pip install selenium 
6.安裝控件定位工具
weditor beta 針對Android和iOS原生應用快速定位元素,自動生成代碼。
安裝方式:
pip install --pre weditor
7.安裝截圖工具:
在進行游戲時,游戲界面的元素是無法使用原生的控件進行定位的,所以需要用到atx基於圖片識別的方式來定位游戲控件。
截圖工具使用方式:
python -m atx gui
二、UI自動化實現
接口描述了操作手機APP的各種方法。
1、廢話不多說,直接上代碼:
  1 # -*- coding: utf-8 -*-
  2 
  3 import atx
  4 import os
  5 from PIL import Image
  6 import pytest
  7 import allure
  8 from allure_commons.types import AttachmentType
  9 from logzero import logger
 10 from uiautomator2 import UiObjectNotFoundError
 11 # from base.chromedrvier import ChromeDriver
 12 from atx.ext.chromedriver import ChromeDriver
 13 
 14 
 15 ISMAC = 1
 16 TIMEOUT = 10
 17 @allure.step("{0}")
 18 def connect_phone(devices):
 19     global package_name,main_activity
 20     # devices = "D6JNOV5PCANFAURW"
 21     logger.info("連接:" + devices)
 22     package_name = 'com.netease.cloudmusic'#網易雲音樂APP的包名
 23     main_activity = ".activity.LoadingActivity" #網易雲音樂的activity
 24     d = atx.connect(devices)#手機的devices name
 25     d.start_app(package_name, main_activity)#啟動網易雲音樂app
 26     return d
 27 
 28 @allure.step("{1}")
 29 def click_text(atx_conn, action_m, text, timeout=TIMEOUT):
 30     """
 31     點擊安卓原生的控件
 32     :param atx_conn:atx實例
 33     :param action_m:執行的行為描述
 34     :param text:需要查找的按鈕的文本
 35     :param timeout:等待
 36     :return:
 37     """
 38 
 39     logger.info(action_m)
 40     atx_conn(text=text).click(timeout=timeout)
 41     report_jietu(atx_conn,action_m)#截圖
 42 
 43 @allure.step("{1}")
 44 def click_id(atx_conn, action_m, id, timeout=TIMEOUT):
 45     """
 46 
 47     :param atx_conn: 連接實例
 48     :param action_m: 操作描述
 49     :param id: resureid
 50     :param timeout: 超時時間
 51     :return:
 52     """
 53     logger.info(action_m)
 54     atx_conn(resourceId = id).click(timeout=timeout)
 55     report_jietu(atx_conn,action_m)#截圖
 56 
 57 def report_jietu(atx_conn,action_m):
 58     """
 59    截圖
 60    :param atx_conn:atx實例
 61    :param action_m:action_m,被用作圖片名稱
 62    :return:
 63    """
 64     image = screenshot(atx_conn,action_m)#截圖
 65     with open(image,"rb") as f :
 66         file = f.read()
 67     allure.attach(action_m,file,allure.attach_type.PNG)#截圖附件
 68 
 69 def screenshot(atx_conn,url):
 70     """
 71     截圖
 72     :param atx_conn:atx實例
 73     :param url:url,被用作圖片名稱
 74     :return:
 75     """
 76 
 77     path = os.path.abspath(os.path.dirname(os.getcwd()))
 78     if ISMAC:
 79         path = path + "/report/image/%s.png" % (url)
 80     else:
 81         path = path + "\\report\\image\\%s.png" % (url)
 82     imgname = path
 83     atx_conn.screenshot(imgname)
 84     img(imgname)
 85     return imgname
 86 
 87 def img(image):
 88     """
 89     對圖片進行壓縮,覆蓋原圖進行保存
 90     :param image: 圖片路徑
 91     :return:
 92     """
 93 
 94     im = Image.open(image)
 95     # 獲得圖像尺寸
 96     w, h = im.size
 97     # print('原圖尺寸: %sx%s' % (w, h))
 98     # 縮放到25%:
 99     im.thumbnail((w // 4, h // 4))
100     # 把縮放后的圖像用jpeg格式保存:
101     im.save(image)
102 
103 
104 
105 @allure.feature('網易雲音樂')
106 class Test_misuc(object):
107     @allure.story('進入每日推薦,點擊播放第一首歌曲')
108     def test_meirituijian(self):#進入每日推薦,點擊播放第一首歌曲
109         d = connect_phone("D6JNOV5PCANFAURW")#連接手機,啟動雲音樂
110         click_text(d,"點擊每日推薦","每日推薦")#點擊每日推薦
111         click_text(d,"點擊播放全部","播放全部")#點擊播放全部
112         click_id(d,"點擊暫停播放按鈕","com.netease.cloudmusic:id/tr")#點擊暫停播放按鈕
113         d.stop_app(package_name) #關閉雲音樂
114 
115     @allure.story('進入我喜歡的音樂,將第一首歌分享給好友')
116     def test_share(self):#分享歌曲給好友
117         d = connect_phone("D6JNOV5PCANFAURW")#連接手機,啟動雲音樂
118         click_text(d,"點擊我的","我的")
119         click_text(d,"點擊我喜歡的音樂","我喜歡的音樂")
120         click_id(d,"點擊更多","com.netease.cloudmusic:id/a")
121         click_text(d,"點擊分享","分享")
122         click_text(d,"點擊分享微信好友","微信好友")
123         # driver = ChromeDriver(d).driver() #啟動selenium 如果是webview頁面的話,需要啟動selenium,然后根據selenium的定位方式查找元素
124         click_text(d,"分享給唯安格","唯安格")
125         click_text(d,"點擊分享","分享")
126         click_text(d,"點擊返回網易雲音樂","返回網易雲音樂")
127         d.stop_app(package_name)
128 
129 
130 
131 
132 if __name__ == '__main__':
133     a = Test_misuc()
134     a.test_meirituijian()
135     a.test_share()
View Code

運行上面代碼並生成測試報告:

運行用例: py.test test_aa.py -s --alluredir ./reports
生成報告:allure generate --clean reports

其他工具啟動:

啟動weditor :python3 -m weditor
uiautomator2 初始化:python3 -m uiautomator2 init
啟動atx gui: python3 -m atx gui
指定用例運行:py.test test_ddz.py::TestClass::test_share --alluredir ./reports

2、查看測試報告:執行完:allure generate --clean reports

 命令之后,會在當前文件夾生成:allure-report文件夾,該文件下會有一個index.html的文件,只用瀏覽器打開index.html文件,可以查看生成的測試報告。

如下圖:

 
allure生成測試報告的方法請看官方文檔:https://docs.qameta.io/allure/#_pytest

參考:
       
       
       
               


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM