UiAutomator python+pytest+uiautomator2+allure 移动端测试(一)

RunningOvO · 2023年02月19日 · 最后由 RunningOvO 回复于 2023年06月07日 · 4962 次阅读

写文章原因:在手机厂商(小厂)工作,常规测试已经不能满足平常工作以及售后问题,所以在学习适合工作的技术。

网上找了一大圈相关移动端自动化测试的课程、线下的书籍,基本上都是一些培训机构对于 python+uiautomator2 的基本操作公开课,真正的干货的东西还是在大佬的博客中一个一个尝试出来的,所以决定自己记录总结下来,方便回顾。

为什么选这个方案

pytest 这个方案只能在线运行,严格来说并不适合手机厂商,因为平常工作追求高效率应该用 JAVA+uiautomator2+junit 根据系统 key 生成 apk 离线跑更合适,但是找了一大圈资料实在是没找到,在 appium 与 uiautomator2 之中选了其次合适的。

先写一个 pytest+uiautomator2 压测通话脚本(也就是外面那种一个小时学会自动化测试的课程)

python==3.10
sdk ==android 9-12(写java时用到)
adb ==用的sdk自带的

pycharm 中使用命令安装

pip install -i pypi.tuna.tsinghua.edu.cn/simple/ uiautomator2

手机安装小黄车 atx

python -m uiautomator2 init

元素定位选择 adb 自带

多设备拨打脚本如下

class callup():
    def __init__(self, count, deviceid):
        self.count = count
        self.deviceid = deviceid

    def connectPhone(self):
        deviceA = u2.connect_usb(deviceid)

class child(callup):
    #实列化父类
    callup = callup()
    def startCall(self):
        callup.deviceA(text="拨打电话").click()

复制代码

import time
from os.path import exists

import uiautomator2 as u2

class callup():
    def __init__(self, count):
        self.count = count

    def startCall(self):
        if deviceA(text='拨打电话').exists:
            deviceA(text='拨打电话').click()
        else:
            print('已在拨打电话界面')
        if deviceA(resourceId='com.android.dialer:id/dialpad_floating_action_button').exists:
            print("拨号盘已打开")
        time.sleep(2)
        if deviceA(resourceId='com.android.dialer:id/fab').exists:
            print("拨号盘已收缩")
            deviceA(resourceId='com.android.dialer:id/fab').click()

    def takeCall(self):
        deviceA(resourceId='com.android.dialer:id/one').click()
        deviceA(resourceId='com.android.dialer:id/zero').click()
        deviceA(resourceId='com.android.dialer:id/zero').click()
        deviceA(resourceId='com.android.dialer:id/eight').click()
        deviceA(resourceId='com.android.dialer:id/six').click()
        deviceA(resourceId='com.android.dialer:id/dialpad_floating_action_button').click()
        deviceA(resourceId='com.android.dialer:id/contactgrid_bottom_timer').wait(timeout=15.0)
        time.sleep(5)
        deviceA(resourceId='com.android.dialer:id/incall_end_call').click()

    def repeatTake(self):
        i = 1
        while (self.count > 0):
            self.startCall()
            self.takeCall()
            print("第 %d 次拨打" % i+'成功')
            i = i + 1
            self.count = self.count - 1
            time.sleep(5)

if __name__ == '__main__':
    deviceid = str(input("请输入序列号:"))
    deviceA = u2.connect_usb(deviceid)
    count = int(input("请输入电话次数:"))
    deviceA.implicitly_wait(3)
    callup = callup(count)
    callup.repeatTake()

上面脚本通过 python 窗口输入的 sn 号与压测次数,通过 resourceId 或 text 属性定位元素,达到压测通话功能的目的。

但是会有 3 个问题:

1.如果在测试当中,某个元素因第三方因素或机器异常无法识别,该脚本就直接停止,并保留现象。无法达到咱们一个压测次数或时长的目的(这就需要失败重跑了)
2.假设测试过程中异常了,咱们还想看到当时现场的时间以及相关截图以便分析(这就需要加 log 打印以及截图了)
3.领导想看整体的测试报告,无法给出
所以这种只能自用,对工作以及技术发展并没有太大的帮助噢

共收到 5 条回复 时间 点赞

学习下,吸收点经验值

JAVA+uiautomator2+junit 根据系统 key 生成 apk 离线跑更合适,但是找了一大圈资料实在是没找到
Android 官网都有。。。都贴了 github 项目地址了,可以去看看

  1. Weditor 了解一下,配套的用来在网页端抓取页面元素很方便,也是同一位大佬做的。
  2. 失败重试,可以在你的循环里面加多一个异常处理,重新做初始化。
  3. 只要是自己的实践就是积累的经验,不懂你为何说对工作和技术发展没有帮助。难道你把这个任务做下来了不是你工作的一部分?难道你把这一套写下来对你自己来说学不到任何东西?
mojin 回复

加了默金的群,他的哔哩哔哩视频还可以。

需要 登录 後方可回應,如果你還沒有帳號按這裡 注册