Android UI自动化专项测试-设备拉流

场景:

"""
:前提条件:① 账号下要绑定被测设备;② 关闭消息通知,不要弹push,会遮挡按钮的点击
:设备为在线状态,可以开流
:网络稳定,可以考虑放在屏蔽箱里执行
:电量充足,不能关机
:如果中间有升级弹窗出现,点击取消或忽略本次升级,其他弹窗类似
:步骤:
:1. 确认设备已休眠
:2. 冷启动App
:3. 开流,等结果(成功 or 失败)
:重复以上 1 2 3,记录下每次的结果
"""

步骤不多,但实现起来要考虑到尽可能多的情况:

首先是设备型号问题,如果指定具体的设备名称,那么下次变换设备后,名称仍然需要变换,实现中考虑到试用接口获取设备的名称,传参是设备的型号,就是说下次如果换其他类型的设备,只需调用该方法就可以返回对应型号的名称了。

def get_device_name(model='xxx', xx_host=xxHostCnTmp):
    """
    获取设备列表中指定的model的设备,并将其返回
    :param xx_host: 域名,默认为中国区
    :param model: 默认是xxx
    :return: 将设备的名称返回
    """
    pwd_md5 = _md5(pwd)
    _login(gz_host, _email=email, _region='CN', country_code='86', _password=pwd_md5, _type=1)
    url = 'https://' + xx_host + '/v1/dev/getList' + '?' + 'uuid=' + 'android_ui_auto' + '&' + 't=' + '004'
    headers = _headers()
    headers['xx-Sid'] = SID
    headers['xx-Uid'] = UID
    rsp = requests.post(url, headers=headers, timeout=(10, 10), verify=False)
    logging.info(rsp.json())

    # 变量设备列表,筛选指定设备类型的设备名称并返回,例如,默认类型是xxx
    devices = list(rsp.json()["data"]["list"])
    if devices:
        for device in devices:
            # 获取指定设备类型的设备的名称,并且是主人设备,并且是在线的设备 满足条件的第一个
            if device["model"] == model and device["role"] == 0 and device["online"] == 1:
                dev_name = device["name"]
                return dev_name

确定了设备的名字后,需要找到该设备,用到了滚动查找的方法:

master.find_element_by_android_uiautomator('new UiScrollable(new UiSelector().scrollable('
                                                              'true)).scrollIntoView(new UiSelector().text("%s"))' %
                                                              dev_name)

进入开流页面后,需要等待加载过程消失,用到了直到元素消失的方法:

WebDriverWait(master, timeout=45, poll_frequency=2).until_not(
                lambda x: x.find_element_by_id('com.xxxxxxxx.android:id/tv_live_play_loading'))

该场景最关键的一步是判断拉流的状态,开流到底是成功了还是失败了,跟开发沟通,确定了判断标准,就是在logcat中查看关键字状态,'playState:Playing'是开流成功的标志。为了获取这个字段值,需要查看实时日志,为此单独写了一个方法:

def get_dev_play_state(dev_id=get_dev_id()):
    cmd = 'adb -s %s shell logcat -v time -s LivePlayer "\| grep -e playState"' % dev_id
    print(cmd)

    p_obj = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # 等待日志获取完成
    time.sleep(4)
    # 获取完成后药结束子进程
    p_obj.terminate()
    p_obj.kill()
    # 获取结束后读取内容
    lines = p_obj.stdout.readlines()
    # 将bytes转换成字符串
    last_line = lines[-1].decode('utf-8')
    print("最后一行:", last_line)
    results = last_line.split()
    # 查找playState字段
    for word in results:
        if 'playState' in word:
            play_state = word
            break

    # 获取完成后清除logcat
    r_obj = os.popen("adb logcat -c")
    r_obj.close()

    return play_state

后面面是对该字段值的判断,如果失败则截图,取日志。

该专项是对上面步骤的多次重复,可以是500次也可以是1000次,通过pytest框架完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值