使用uiautomator2自动化测试app(三)------实战篇

这里我主要会介绍怎么自动的化操控模拟器和一些其它的测试.

1. 博主使用的是雷电模拟器,其它模拟器不适用此方法

雷电模拟器接口: http://www.ldmnq.com/bbs/thread-30-1-1.html

这里面是介绍了雷电模拟器调试接口的一些命令,需动手在cmd上先行操作!

2. 新建一个.py文件,开始编写脚本

这里主要实现了:

2.1 创建模拟器

2.2 修改模拟器的分辨率(调成手机)

2.3 启动模拟器

2.4 安装app和一些自动化调试的插件

# -*- coding:UTF-8 -*-
import os
import subprocess
from time import sleep
from optparse import OptionParser


class LeiDian(object):
    def __init__(self):
        # 启动虚拟机
        self.start_vm = 'dnconsole.exe launch --name  %d'
        # 新增虚拟机
        self.add_vm = 'dnconsole.exe add --name %d'
        # 修改分辨率
        self.alter_ratio = 'dnconsole.exe modify --index %d --resolution 540,960,240'
        # 安装app
        self.install_app = 'dnconsole.exe installapp --index %d --filename %s'
        # app路径
        self.app_path = 'D:\\Changzhi\Facebook_x86_128.apk'
        # dnconsole.exe路径
        self.ld_path = 'D:\\Changzhi\dnplayer2'
        # 查看虚拟机所有信息
        self.all_vm_info = 'doconsole.exe list2'

    # 切换目录
    def chair(self):
        try:
            retval = os.getcwd()
            print("当前工作目录为 %s" % retval)
            # 切换到当前路径
            os.chdir(self.ld_path)
            # 查看修改后的工作目录
            retval2 = os.getcwd()
            print("当前工作目录已修改为 %s" % retval2)
        except Exception as e:
            print(e)
        else:
            self.view_vm(index=61)

    # 查看虚拟机
    def view_vm(self, index):
        data = subprocess.Popen('dnconsole.exe list2', stdout=subprocess.PIPE, universal_newlines=True)
        # 虚拟机全部信息
        # data_info = data.stdout.read()
        number_list = []
        for line in data.stdout:
            # 含有换行符
            info = line.strip().split(',')
            vm_number = info[1]
            number_list.append(vm_number)
        if str(index) in number_list:
            print('该虚拟机已经存在')
        else:
            self.make_vm(index=index)

    # 创建模拟器
    def make_vm(self, index):
        subprocess.call(self.add_vm % index)
        print('创建模拟器{}成功!'.format(index))
        subprocess.call(self.alter_ratio % index)
        print('修改模拟器{}分辨率成功!'.format(index))
        subprocess.call(self.start_vm % index)
        print('启动模拟器{}'.format(index))
        print('开始安装Facebook!')
        code = subprocess.call(self.install_app % (index, self.app_path))
        if code == 0:
            sleep(60)
            print('安装Facebook成功!')
        print('开始安装uiautomator2!')
        subprocess.call('python -m uiautomator2 init')
        print('安装uiautomator2成功!')


if __name__ == '__main__':
    leidain = LeiDian()
    leidain.chair()

上面代码主要的流程是:

切换当前的工作目录 ------> 调用雷电模拟器命令代码

里面有些参数不懂得话,自行输出查看即可了解

3. 启动app,输入账号与密码,登录app

import uiautomator2 as u2
from time import sleep
import uiautomator2.ext.htmlreport as htmlreport


class LeiDian(object):
    def __init__(self):
        try:
            self.d = u2.connect_usb('emulator-5656')
        except Exception as e:
            print(e)
        # 全局设置,每个ui点击之后休眠1.5s
        self.d.click_post_delay = 1.5
        hrp = htmlreport.HTMLReport(self.d)
        hrp.patch_click()

    # 连接测试
    def link_test(self):
        if self.d.info['naturalOrientation'] == True:
            print('设备连接正常!')
            self.run_app()
        else:
            print('设备连接出现问题!请检查后重试!')

    # 运行app
    def run_app(self):
        # 先返回主菜单界面
        self.d.press('home')
        self.d(text="Facebook").click()
        self.login_app()

    # 登录app
    def login_app(self):
        self.d(resourceId="com.facebook.katana:id/login_username").set_text('账号')
        self.d(resourceId="com.facebook.katana:id/login_password").set_text('密码')
        try:
            self.d(text='登录').click()
        except Exception as e:
            print(e)
        else:
            print('正在登录>>>>>>\n请稍后>>>>>>')


if __name__ == '__main__':
    leidain = LeiDian()
    leidain.link_test()

4. 查找设备数量(也是非常有用的)

# 查找设备数量
def finddevices():
    data = subprocess.Popen('adb devices', stdout=subprocess.PIPE, universal_newlines=True)
    data_info = data.stdout.read()
    devices = re.findall(r'(.*?)\s+device', data_info)
    if len(devices) > 1:
        deviceIds = devices[1:]
        print('共找到%s个手机' % str(len(devices)-1))
        for i in deviceIds:
            print('ID为%s' % i)
        return deviceIds
    else:
        print('没有找到手机,请检查')
        return


finddevices()

5. 当你想要找的元素有多个相同的实例, 或者有时屏幕可能包含多个具有相同属性的视图时, 可以使用以下这种写法

year_number=int(d(className="android.widget.LinearLayout").child(className="android.widget.NumberPicker", instance=2).child(className="android.widget.EditText").get_text())

其中child这个用法我就不多说了, 说一下instance这个参数, 它的主要的作用就是在有相同属性的时候定位到你想要的第几个属性默认是从0开始, 也就是你将instance设为0之后, 代码选择的是属性的第一个实例(以此类推)......

例如:

6. 元素点的状态辨别, 有些时候你定的元素的位置其实是没有问题的, 但是它总是或多或少的去点击另外一个看似毫不相干的点, 这个时候我们就要让它在重新点击回我们想要的位置, 也许你会想到做判断, 这是没有问题的, 如果它点击其它点较多的情况下适合. 但如果它点击其它的点就几乎一个的时候, 我们可以使用, 用这个点的点击状态来进行判断.

                        if d(descriptionStartsWith="Selected, Friend Requests").exists:
                            time.sleep(2)
                            d(resourceId="com.facebook.katana:id/news_feed_tab").click_exists(timeout=15)

上面这段代码的意思就是说, 当if里面的这个点的点击状态存在或者已触发, 那么让它在重新点击我们之前想要的位置.

7. 如果你不太会将可以滚动的元素滚动到指定位置时你可以试试这个方法(在git上还有它类似的写法)

d(scrollable=True).scroll.to(text=u"Share")

上面这句代码的意思就是说滚动到元素文本为Share上, 是不是很方便~~~~~~

陆陆续续会补充一些有用的代码或者逻辑

项目已上传https://github.com/zhixideyu/uiautomator2---FaceBook

 

如果感觉内容不错的话,支持一下作者。

<think>嗯,我现在要了解一下uiautomator2这个自动化测试工具。首先,我应该从基本概念开始,弄清楚它是什么,用来做什么的。可能是一个用于Android应用的UI自动化测试框架,因为名字里有uiautomator,而Android有原生的UI Automator工具。 然后,用户可能想知道uiautomator2和原生的有什么区别。原生的UI Automator是基于Java的,而uiautomator2可能做了一些改进或者简化。听说uiautomator2是用Python封装的,这样可以用Python写测试脚本,可能更方便。 接下来,需要了解uiautomator2的主要特点。比如支持不需要侵入应用代码,直接通过屏幕元素进行操作。可能还有元素定位的方式,比如通过id、text、description等属性定位控件。另外,是否支持手势操作,比如滑动、长按等,还有如何处理弹窗和动态加载的内容。 安装步骤可能涉及Python的包管理工具pip,安装命令大概是pip install uiautomator2。然后可能需要初始化一些设备连接,比如连接手机或者模拟器,需要开启USB调试模式。有没有相关的初始化命令,比如python -m uiautomator2 init,用来安装守护进程apk到设备上。 使用流程可能包括连接设备,获取设备对象,然后通过选择器定位元素,执行点击、输入等操作。可能还需要处理不同设备的适配,比如通过设备的序列号或者连接地址来指定设备。另外,是否支持图像识别或者OCR功能,这在处理一些难以定位的元素时很有用。 代码示例可能是一个简单的测试脚本,比如启动应用,点击按钮,输入文本,然后验证结果。需要注意元素定位的方法,比如d(text="Login").click(),这样的语法是否正确。还有异常处理,比如元素找不到时的超时设置,或者重试机制。 优势方面,可能包括跨版本兼容性好,支持Android 4.4及以上,或者使用Python的简洁语法提高开发效率。劣势可能是不支持iOS,仅限于Android平台,或者某些复杂手势操作需要额外处理。 常见问题可能涉及连接问题,比如设备未被识别,需要检查ADB驱动或者USB调试是否开启。元素定位失败时如何处理,可能需要使用XPath或其他选择器,或者等待元素出现。还有性能问题,比如执行速度较慢,或者资源占用较高。 学习资源方面,可能有官方文档、GitHub仓库、社区论坛或者博客教程。是否需要推荐具体的资源链接,或者示例项目供用户参考? 在回答时,需要确保结构清晰,分点说明,并且覆盖用户可能关心的各个方面。同时,检查是否有错误的信息,比如uiautomator2是否真的不需要应用源码,或者是否需要root权限。可能还需要提到与Appium的区别,比如更轻量级,或者更适合Python开发者。 总之,我需要系统地整理uiautomator2的定义、特点、安装步骤、基本用法、优缺点、常见问题及解决方案,以及学习资源,确保信息准确且易于理解。</think>### **uiautomator2 自动化测试工具介绍** uiautomator2 是一个基于 Python 的 Android UI 自动化测试框架,封装了 Android 原生 `UIAutomator` 接口,简化了脚本编写流程,适合用于移动应用的 UI 功能测试。 --- #### **1. 核心特点** - **无需侵入代码**:无需修改被测应用源码,直接操作屏幕元素。 - **跨版本支持**:兼容 Android 4.4+ 系统。 - **元素定位灵活**:支持通过 `ID`、`text`、`description`、`XPath` 等属性定位控件。 - **丰富操作支持**:点击、滑动、长按、输入文本、截图等基础操作,并可扩展复杂手势。 - **Python 语法友好**:利用 Python 简洁语法快速编写测试脚本。 --- #### **2. 安装与初始化** **步骤 1:安装 Python 包** ```bash pip install uiautomator2 ``` **步骤 2:设备初始化** 连接 Android 设备(需开启 USB 调试),执行以下命令安装守护进程: ```bash python -m uiautomator2 init ``` --- #### **3. 基础用法示例** ```python import uiautomator2 as u2 # 连接设备(通过设备序列号或IP) d = u2.connect("设备序列号") # 或 u2.connect("192.168.1.100:5555") # 启动应用 d.app_start("com.example.app") # 定位元素并操作 d(text="登录").click() # 点击登录按钮 d(className="EditText").set_text("user123") # 输入文本 # 滑动操作 d.swipe(500, 1500, 500, 500, 0.5) # 向上滑动 # 断言元素是否存在 assert d(text="欢迎回来").exists(timeout=10) ``` --- #### **4. 核心优势与劣势** | **优势** | **劣势** | |-----------------------------------|-----------------------------------| | 1. 直接操作 UI,无需源码或 Root 权限 | 1. 仅支持 Android 平台 | | 2. 语法简洁,Python 开发者友好 | 2. 复杂场景需结合其他工具(如 OpenCV 图像识别) | | 3. 性能优于 Appium(轻量级) | 3. 动态元素需手动处理等待逻辑 | --- #### **5. 常见问题与解决** - **设备连接失败** - 检查 USB 调试是否开启,或使用 `adb devices` 验证设备识别。 - 无线连接需执行 `adb tcpip 5555` 并确保同一网络。 - **元素定位超时** - 增加等待时间:`d(text="按钮").exists(timeout=10)` - 使用 `XPath` 或 `child` 选择器精确定位层级。 - **动态加载内容处理** - 结合 `Watcher` 监控弹窗或动态元素。 --- #### **6. 学习资源推荐** 1. **官方文档**:[GitHub - openatx/uiautomator2](https://github.com/openatx/uiautomator2) 2. **实战教程**:CSDN、掘金等平台的自动化测试专栏。 3. **扩展工具**:`weditor`(可视化元素定位工具): ```bash pip install weditor python -m weditor ``` --- **总结**:uiautomator2 适合快速实现 Android 应用的 UI 自动化测试,尤其适合 Python 开发者。需结合场景灵活处理动态元素和复杂操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

她最爱橘了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值