目录
Talking is cheap, show me your code.
前言:
轮子是一种基于 adb 的 UI 自动化测试框架,它可以帮助我们快速、准确地进行 UI 自动化测试。轮子提供了一系列方便实用的工具和方法,帮助我们编写高效、可靠的自动化测试脚本。
Talking
-
第一步,找元素
实现原理:使用 adb -s shell uiautomator dump /sdcard/uidump.xml 命令 dump 出当前 UI 布局树,使用 python 解析 xml,通过指定常见的 id, text, xpath 等等获取节点的坐标信息;拿到元素坐标,我们就可以进行下一步操作了。 -
第二步,做动作
实现原理:使用 adb -s shell input 等命令,结合上一步获取到的坐标,就可以实现常用用户操作;可以用户操作,我们可以下一步了。 -
第三步,做判断
实现原理:这一步比较灵活,我常用的方法有这些:第一是判断某个元素是否存在(通过第一步找元素判断),此方法用的最多;第二是截图对比,这个方法一般用在网络加载一个带图片的列表时。
Talking is cheap, show me your code.
代码不是很多:主框架 300 行左右, 两个 python 文件(mobtest.py 和 AndroidKeycode.py)。
- 微框架里面只包含了使用于我自己工作的部分方法,范围比较小;
- 代码写的烂,努力搬砖中;
- 欢迎留言一起扯。
mobtest.py
# coding:utf-8
# Name : mobtest
# Author : wanyor@qq.com
# Desc : A simple ui automation framework for android
# Time : 2017-1-16 15:10:48
import os
import re
import time
import tempfile
import xml.etree.cElementTree as ET
from AndroidKeycode import Keycode
class Utils(object):
"""docstring for Utils"""
def __init__(self):
super(Utils, self).__init__()
def find_devices(self):
rst = os.popen('adb devices').read()
devices = re.findall(r'(.*?)\s+device', rst)
if len(devices) > 1:
return devices[1:]
else:
# raise Exception('DeviceNotFound')
return []
class Device(object):
# 元素内部类
class Element(object):
"""docstring for Element"""
def __init__(self, x, y, device_id):
self.x = str(int(x))
self.y = str(int(y))
self.device_id = device_id
def click(self):
Device(self.device_id).click(self.x, self.y)
def input(self, text):
self.click()
Device(self.device_id).input_text(text)
# 设备未找到异常类
class DeviceNotFoundException(Exception):
def __init__(self, err='设备未找到' ):
Exception.__init__(self, err)
# 元素未找到异常类
class ElementNotFoundException(Exception):
def __init__(self, err='未找到此元素'):
Exception.__init__(self, err)
# activity未找到异常类
class ActivityNotFoundException(Exception):
def __init__(self, err='未找到此activity'):
Exception.__init__(self, err)
# 设备初始化方法
def __init__(self, device_id):
super(Device, self).__init__()
self.device_id = device_id
devices = re.findall(r'(.*?)\s+device', os.popen('adb devices').read())[1:]
# print devices
if device_id not in devices:
self.DeviceNotFoundException()
self.tempFile = tempfile.gettempdir()
self.pattern = re.compile(r"\d+")
# 安装unicode输入法并激活
# self.install_app(os.getcwd() + '/bin/apk/MobInput.apk')
# self.shell_cmd('ime enable org.mobtest.input/.InputService')
# self.shell_cmd('ime set org.mobtest.input/.InputService')
# 辅助类
def get_abi(self):
return self.shell_cmd('getprop ro.product.cpu.abi').strip()
def get_sdk(self):