轮子:基于 adb 的 UI 自动化 “微框架”

本文介绍了一个基于adb的UI自动化测试框架——轮子,它通过解析XML布局树找元素,结合adb input命令执行操作,并进行元素判断,实现高效测试。文章提供了主要代码模块的概览,并邀请读者一起交流自动化测试经验。
摘要由CSDN通过智能技术生成

目录

前言:

Talking

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):
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值