zoukankan      html  css  js  c++  java
  • 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种方法执行选择点击操作,然后再运行自动化测试项目。

  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/lfr0123/p/13639195.html
Copyright © 2011-2022 走看看