• Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)


    一,问题

    app自动化测试使用Android真机连接电脑时,通常会遇到两种情况:

    1、测试机连接电脑会弹窗提示USB选项,选择USB用于"传输文件",有些手机不支持设置默认USB选项,手机重新连接电脑时都需要手动点击选择USB选项;

    2、使用adb命令在真机上安装app时,需要手动点击确认安装按钮。

    二,思考

    每天定时唤醒手机执行自动化测试时,偶尔会遇到真机重新弹窗提示进行USB用于选项的选择,需要选择USB用于传输文件,否则会执行失败。为了能让手机自动选择USB用于传输文件,我们考虑以下解决方法:

    1,修改手机默认设置,不可行。在手机里设置USB默认选择USB用于"传输文件",但发现现在很多手机里面并没有这个设置选项,行不通。

    2,通过appium定位元素解决,不可行。因为执行的顺序是先选择USB选项,再通过appium启动APP进行元素定位,所以此时使用appium的webdriver定位元素再点击"传输文件"显然也是行不通的。

    3,通过poco自动化测试框架定位元素解决,可行。

    使用豆瓣镜像源下载安装pocoui库,同时会下载airtest库。pip list命令查看,如果未同时安装airtest库,则再安装airtest库:

    # 安装pocoui库
    pip install pocoui -i https://pypi.douban.com/simple/
    # 安装airtest库
    pip install airtest -i https://pypi.douban.com/simple/
    

    代码示例如下:

    from poco.drivers.android.uiautomation import AndroidUiautomationPoco
    
    poco = AndroidUiautomationPoco()
    poco.device.wake()
    # 存在传输文件元素则点击
    if poco(text="传输文件").exists():
        poco(text="传输文件").click()
    else:
        pass
    

    调试运行脚本发现该方法是可行的,但是脚本会报其他错误,暂时还未解决。不推荐使用

    4,通过Python调用adb命令定位元素解决(不依赖测试框架),可行(推荐使用)。

    三,通过Python调用adb命令定位元素解决

    1,思路:

    adb命令获取手机当前页面的UI树xml文件 --> 将xml文件pull到本地 --> 通过元素属性值获取xml文件中对应的属性 --> python解析获取元素的bounds值并计算出该元素的中心坐标 --> 通过adb命令点击该坐标。

    2,获取UI树文件命令:adb shell uiautomator dump +路径

    只有一台手机:adb shell uiautomator dump /sdcard/uidump.xml

    多台手机的话获取对应手机UI树文件命令:adb -s deviceId shell uiautomator dump --compressed /sdcard/uidump.xml

    devicesId即设备id,通过adb devices命令获取

    3,示例代码如下:

    import tempfile
    import os, re, time
    import xml.etree.cElementTree as ET
    
    def topElementCoordinate(deviceId, attr_k, attr_v):
        '''
        通过adb命令获取手机当前页面的ui树-->pull到本地临时文件-->通过属性值从ui树文件中获取元素的bounds-->
        获取元素左上角/右下角的坐标-->得到该元素的中心坐标-->点击
        param deviceId: 手机设备ID
        param attr_k: 元素属性,如text, resource-id, class等
        param attr_v: 属性的值,如text='文件传输',属性值为'传输文件'
        return:
        '''
        tempFile = tempfile.gettempdir()    # 临时文件
        try:
            os.popen("adb -s" + " " + deviceId + " " + "shell uiautomator dump --compressed /sdcard/uidump.xml")
            os.popen("adb -s" + " " + deviceId + " " + "pull /sdcard/uidump.xml " + tempFile)
            tree = ET.ElementTree(file=tempFile + "/uidump.xml")
            treeIter = tree.iter(tag="node")
            for elem in treeIter:
                if elem.attrib[attr_k] == attr_v:
                    bounds = elem.attrib['bounds']
                    coord = re.compile(r"d+").findall(bounds)
                    x_point = (int(coord[2]) - int(coord[0])) / 2.0 + int(coord[0])
                    y_point = (int(coord[3]) - int(coord[1])) / 2.0 + int(coord[1])
                    print(x_point, y_point)
                    os.popen("adb  -s" + " " + deviceId + " " + "shell input tap {} {}".format(str(x_point), str(y_point)))
                    # 删除手机中的xml文件
                    os.popen("adb -s" + " " + deviceId + " " + "shell rm /sdcard/uidump.xml")
                    time.sleep(1)
        except Exception as e:
            print("点击{}中心坐标失败,原因是:{}".format(attr_v, e))
    
    if __name__ == '__main__':
        topElementCoordinate('64c83202', 'text', '传输文件')
    

    运行该文件调试,成功。

    总结,不同的手机连接电脑时,会有不同的提示,此时我们就可以通过第4种方法执行选择点击操作,然后再运行自动化测试项目。

  • 相关阅读:
    C# 时间格式化
    新线程匿名方法的新用法
    响应类
    图灵API
    Xpath使用
    Meta http-equiv属性
    CAC的Debian-8-64bit安装BBR正确打开方式
    CAC的Debian-8-64bit安装BBR正确方式是?
    Mbps Mb M Kb如何换算
    如何解决服务器远程桌面连接成功但重启却操作失效?
  • 原文地址:https://www.cnblogs.com/lfr0123/p/13639195.html
Copyright © 2020-2023  润新知