⼩程序⾃动化实战(⼀)
⼀. Airtest⼯具介绍
1.1 Airtest简介
1) 是⽹易开发的⼀款UI⾃动化测试框架
2) 两⼤核⼼功能: 基于的UI控件识别, 基于的图像识别
1.2 基本操作
1.2.1 ⼯具包下载
pip install airtest
pip install pocoui  # 注意此处不是poco,⽽是pocoui
1.2.2 设备连接
# -*- coding: utf-8 -*-
# @Author  : chinablue
api import connect_device, set_current
device_ip = "127.0.0.1"
device_port = "5037"
device_uuid = "3f9d6008"# 通过[adb devices]来获取
# 连接设备
d = connect_device(f"Android://{device_ip}:{device_port}/{device_uuid}?cap_method=ADBCAP")
# 切换到指定设备
set_current(device_uuid)
# 判断是否亮屏
if d.is_screenon():
d.home()    # 点击Home键
else:
d.wake()    # 唤醒屏幕
1.2.3 基于poco的定位操作
# -*- coding: utf-8 -*-
# @Author  : chinablue
api import connect_device, start_app
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
device_ip = "127.0.0.1"
device_port = "5037"
device_uuid = "3f9d6008"# 通过[adb devices]来获取
# 连接设备
d = connect_device(f"Android://{device_ip}:{device_port}/{device_uuid}?cap_method=JAVACAP")
# 初始化poco对象
poco = AndroidUiautomationPoco(device=d, use_airtest_input=True, screenshot_each_action=False)
# 点击[home]键
d.home()
# 打开app
start_app(package="")  # app包名获取命令: adb shell dumpsys window windows|findstr "mCurrentFocus" # 通过Airtest-IDE来查看页⾯元素
poco(text="发现").click()
poco(textMatches="^⼩程序.*").click()
poco(text="最近使⽤").parent().parent().parent().offspring(text="云访客之测试").click()
注意事项:
  1. 此⽰例中初始化poco对象时需实例化的类为AndroidUiautomationPoco. 更多参考请
  2. 查看UI元素的属性及元素的层级关系需要通过airtest-IDE⼯具来辅助完成
3. ⽬前在pocoui中推荐的定位⽅式有两种, ⼀种是通过属性来定位(⽀持模糊匹配), ⼀种是通过层级关系来定位.
1.2.4 基于图像识别的定位操作
# -*- coding: utf-8 -*-
# @Author  : chinablue
api import connect_device, start_app, touch, Template
device_ip = "127.0.0.1"
device_port = "5037"
device_uuid = "3f9d6008"# 通过[adb devices]来获取
# 连接设备
d = connect_device(f"Android://{device_ip}:{device_port}/{device_uuid}?cap_method=JAVACAP")
# 点击[home]键
d.home()
# 打开app
start_app(package="")  # app包名获取命令: adb shell dumpsys window windows|findstr "mCurrentFocus" # 点击[发现], 通过Airtest-IDE来截取⽬标图⽚
touch(Template(filename="wechat_discover.png"))
注意事项:
  1. wechat_discover.png在这⾥下载 :
  2. 通过airtest-IDE⼯具完成截图后, 需要去对应⼯作⽬录中将png格式的图⽚拷贝到测试脚本中
⼆. UI⾃动化测试中的PO模式
2.1 如何理解PO模式
1) PO是Page Object的缩写, PO模式体现了分层设计的思想
2) PO的优点: 提⾼代码的可读性,提⾼代码的可维护性,提⾼代码的复⽤性
3) 主要想解决的问题: 测试⽤例不会因某个元素定位发⽣变化⽽去修改所有相关的测试⽤例
4) PO模式是将每个页⾯映射成class类,通过这个类来维护当前页⾯元素(映射成类对象属性)和页⾯操作(映射成类⽅法)
5) 结合PO模式, 对测试脚本的逻辑分层设计:
  定位信息层: 填写元素信息或图⽚信息
  基本操作层: 定义页⾯元素的基本操作
  业务场景层: 将页⾯的基本操作组装成⼀个个⽤例步骤
  测试⽤例层: 编写测试⽤例
2.2 Page层的设计思路
# -*- coding:utf-8 -*-
# Author:chinablue
import logging
import allure
from bns.pages.base_page import BasePage
# 元素操作封装
class Handle(BasePage):
"""
    对页⾯操作的基础封装
  """
def__init__(self, driver):
app开发实例
super().__init__(driver)
self.logger = Logger(__name__)
# 业务场景封装
class Business(Handle):
"""
    对单个测试步骤的封装
  """
def__init__(self, driver):
super().__init__(driver)
@allure.step("断⾔: 页⾯关键信息检查")
def is_current_page(self):
pass# 页⾯关键信息的断⾔
# 元素信息管理:Android
class AndroidLocator(Business):
def__init__(self, driver):
super().__init__(driver)
self.poco_locator()
self.airtest_locator()
def poco_locator(self):
pass
def airtest_locator(self):
pass
注意事项:
  1. BasePage类会根据定义的属性来动态绑定元素操作⽅法, ⽬前可特殊识别的属性有: a_*,  p_*,  image_*
  2. 每个page页会定义有继承关系的3个类: Handle类, Business类, AndroidLocator类
  3. 对于⼀些⾮重点测试的page页, 可以和其他page页进⾏适当合并
  4. AndroidLocator类中⽀持poco定位和图像识别定位, 但⽆论采⽤哪⼀种定位⽅式,属性命名要有意义
  5. Business类中需要复写is_current_page⽅法, 该⽅法会对当前页⾯特征进⾏断⾔
更为详细的例⼦请参考这⾥
三. UI⾃动化框架介绍
动态查页⾯, 通过属性的⽅式来获取page的实例化对象
使⽤pytest组织测试⽤例, allure.step对⽤例进⾏分层
3.1 项⽬结构介绍
|-base        # 基础层
|-bns        # 业务层: 基于PO模式设计
|-pages    # 每个页⾯定义成⼀个py⽂件, 每个py⽂件中有3个类
|-screenshots  # 截图定位的图⽚ 
|-init_app.py  # 设备连接, poco初始化操作
|-testcase    # ⽤例层: 主要调⽤⽤例步骤,进⾏页⾯断⾔
|-config.py  # 配置⽂件: ⽀持在运⾏过程中通过set⽅式来修改配置⽂件,⽅便在持续集成场景的使⽤|-main.py    # 执⾏⼊⼝
3.2 编写第⼀个⽤例, 分析代码之间的调⽤关系