uiautomator2 App自动化测试框架【二】

本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/124415385

前面分享了使用uiautomator2 来写 app自动化脚本的第一期 https://blog.csdn.net/zyooooxie/article/details/123916767,现在把分享下 第二期。

【实际这篇博客推迟发布N个月】

个人博客:https://blog.csdn.net/zyooooxie

【以下所有内容仅为个人项目经历,如有不同,纯属正常】

本期内容

本期主要是说 conftest.py、登录退出相关的.py、配置文件.ini、执行入口main.py。

在这里插入图片描述

代码

部分代码做了修改

@filename: conftest.py

"""
@blog: https://blog.csdn.net/zyooooxie
"""

import os
import time
import pytest
import uiautomator2 as u2

from membership_interests_app_autotest.user_log import Log

from membership_interests_app_autotest.common_function import clean_files
from membership_interests_app_autotest.common_function import create_allure
from membership_interests_app_autotest.common_function import uninstall_app
from membership_interests_app_autotest.common_function import install_app
from membership_interests_app_autotest.common_function import result_path

from membership_interests_app_autotest.login_logout import login, login_xgtw, logout_xgtw, logout

from membership_interests_app_autotest.common_variable import common_serial_number, install_app_path_dl, screenshot_path
from membership_interests_app_autotest.common_variable import install_app_path_xgtw, dl_app_package, xgtw_app_package
from membership_interests_app_autotest.common_variable import now_pictures_path, diff_pictures_path


@pytest.fixture(scope='session', autouse=True)
def before_after():
    """
    脚本setUp\tearDown
    :return:
    """
    print(time.strftime('%Y%m%d-%H%M%S'))

    clean_files(screenshot_path)
    clean_files(now_pictures_path)
    clean_files(diff_pictures_path)

    # install_app(app_path=install_app_path_dl, serial_number=common_serial_number, app_package=dl_app_package)

    # clean_files(result_path)  # 使用pytest的命令行 --clean-alluredir

    yield

    # uninstall_app(app_package=dl_app_package, serial_number=common_serial_number)

    print(time.strftime('%Y%m%d-%H%M%S'))

@pytest.fixture(scope='module')
def before_after_dl():
    """

    :return:
    """

    login(connect_addr=common_serial_number)

    yield

    logout(connect_addr=common_serial_number)


@pytest.fixture(scope='function')
def device_dl(before_after_dl, request):
    """

    :param before_after_dl:
    :param request: 固定用法,参数化读取 app_package
    :return:
    """

    app_package = request.param['app_package']

    device = u2.connect(addr=common_serial_number)

    device.app_start(app_package, stop=True)

    # This function will have influence on click, long_click, drag_to, get_text, set_text, clear_text, etc.
    device.implicitly_wait(10)

    yield device

    device.app_stop(app_package)

    assert app_package not in device.app_list_running()


@pytest.fixture(scope='function')
def device_xgtw(before_after_xgtw_module, before_after_xgtw_session, request):
    """

    :param before_after_xgtw_module:
    :param before_after_xgtw_session:
    :param request:固定用法,参数化读取 app_package
    :return:
    """

    app_package = request.param['app_package']

    device = u2.connect(addr=common_serial_number)
    device.set_fastinput_ime(True)

    device.app_start(app_package, stop=True)

    # time.sleep(3)  # 等待APP启动

    device.implicitly_wait(10)

    yield device

    device.app_stop(app_package)
    assert app_package not in device.app_list_running()


@pytest.fixture(scope='module')
def before_after_xgtw_module(request):
    """

    :param request:
    :return:
    """
    # app_package = request.param['app_package']
    area_code = request.param['area_code']

    # 香港台湾APP 要执行登录|退出
    login_xgtw(connect_addr=common_serial_number, area_code=area_code.value)

    yield

    logout_xgtw(connect_addr=common_serial_number, area_code=area_code.value)


@pytest.fixture(scope='session')
def before_after_xgtw_session():
    """

    :return:
    """

    install_app(serial_number=common_serial_number, app_path=install_app_path_xgtw, app_package=xgtw_app_package)

    yield

    uninstall_app(app_package=xgtw_app_package, serial_number=common_serial_number)


if __name__ == '__main__':
    pass

@filename: page_login_logout.py

"""
@blog: https://blog.csdn.net/zyooooxie
"""


class PageLoginLogout(object):
    """
    大陆APP-登录、退出登录
    """
    pass


class PageLoginLogoutXGTW(object):
    """
    香港台湾APP-登录、退出登录
    """
    CHUCI = ''
    QIANWANGTIYAN = dict(textContains="前往體驗")

    # 登录
    XUANZEKUANG = dict(textContains="+8")

    TW886 = dict(text="臺灣+886")
    XG852 = dict(text="香港+852")

    QINGCHAKANWANZHENGTIAOKUAN = dict(text="請查看完整條款")

    TONGYIBENTIAOKUAN = dict(textContains="同意本條款")

    DIANHUAHAOMA = dict(text="手提電話號碼")
    YANZHENGMA = dict(text="獲取驗證碼")

    SHURUYANZHENGMA = ''

    GERENZHONGXIN = dict(text="個人中心")

    # 退出登录

    DANGQIANZHANGHAO = dict(text="當前帳號")

    XG_TUICHUDENGLU = dict(text="退出登錄")
    XG_SHI = dict(text="是")


if __name__ == '__main__':
    pass

@filename: login_logout.py

"""
@blog: https://blog.csdn.net/zyooooxie
"""


import time
import uiautomator2 as u2

from membership_interests_app_autotest.user_log import Log
from membership_interests_app_autotest.page_login_logout import PageLoginLogout, PageLoginLogoutXGTW
from membership_interests_app_autotest.common_function import my_element, my_assert

from membership_interests_app_autotest.common_variable import common_serial_number, xg_account, tw_account
from membership_interests_app_autotest.common_variable import dl_app_package, xgtw_app_package
from membership_interests_app_autotest.common_variable import AreaCode


def login(connect_addr: str = common_serial_number):
    Log.info('大陆APP执行login()')

    # TODO 未完成

    pass


def logout(connect_addr: str = common_serial_number):
    Log.info('大陆APP执行logout()')

    # TODO 未完成

    pass


def get_login_account(area_code: int):
    """
    获取港澳台APP 登录账号
    :param area_code:电话区号
    :return:
    """
    if area_code == AreaCode.XG.value:
        login_account = xg_account
        Log.info('香港账号-{}'.format(login_account))

    elif area_code == AreaCode.TW.value:
        login_account = tw_account
        Log.info('台湾账号-{}'.format(login_account))

    else:
        raise Exception('地区传参不对:{}'.format(area_code))

    return login_account


def login_xgtw(area_code: int, connect_addr: str = common_serial_number):
    """
    港澳台APP 登录方法

    install app后,首次登录 输入账号、验证码后,浏览会员完整条款后,选择的 PageLoginLogoutXGTW.TONGYIBENTIAOKUAN :同意本条款,下次不再提醒我;
    故后续 每次登录时,只需要账号+验证码;

    :param area_code: 电话区号
    :param connect_addr:
    :return:
    """
    Log.info('执行login_xgtw()')

    if area_code in (AreaCode.XG.value, AreaCode.TW.value):
        login_account = get_login_account(area_code)

        device = u2.connect(connect_addr)
        device.implicitly_wait(10)

        device.app_start(xgtw_app_package, stop=True)
        # 改强制等待为查找元素XUANZEKUANG
        my_assert(device, PageLoginLogoutXGTW.XUANZEKUANG, 'exists', True, 'is_')

        # 第一次登录时,引导页 要滑动;后续切换账号再登录时,就没这步骤;
        # WEditor查看时,引导页 覆盖在 登录页的上面;

        # 实际步骤:每次登录都先滑动,若是出现 PageLoginLogoutXGTW.QIANWANGTIYAN 【第一次的特殊元素:前往体验】,即 第一次登录;
        try:
            Log.info('try滑动')

            device.sleep(1)
            device.swipe_ext('left')
            device.sleep(1)
            device.swipe_ext('left')

            my_element(device, PageLoginLogoutXGTW.QIANWANGTIYAN).click()

            Log.info('install后 第一次登录')
            not_first = True

        except Exception as e:
            Log.info(str(e))

            Log.info('后续再登录')

            not_first = False

        area_text = my_element(device, PageLoginLogoutXGTW.XUANZEKUANG).get_text()
        Log.debug('当前选择框的text:{}'.format(area_text))

        # 保证 XUANZEKUANG当前area 和 使用的area_code 一致
        if area_text.find(str(area_code)) == -1:
            my_element(device, PageLoginLogoutXGTW.XUANZEKUANG).click()

            abc = PageLoginLogoutXGTW.TW886 if PageLoginLogoutXGTW.TW886.get('text').find(
                str(area_code)) != -1 else PageLoginLogoutXGTW.XG852
            my_element(device, abc).click()

        my_element(device, PageLoginLogoutXGTW.DIANHUAHAOMA).send_keys(login_account)
        my_element(device, PageLoginLogoutXGTW.YANZHENGMA).click()
        my_element(device, PageLoginLogoutXGTW.SHURUYANZHENGMA).set_text('123456')

        if not_first:

            my_assert(device, PageLoginLogoutXGTW.QINGCHAKANWANZHENGTIAOKUAN, 'exists', True, 'is_', assert_time=5)

            first_time = time.time()

            while True:

                device.swipe(fx=0.5, fy=0.75, tx=0.5, ty=0.4, duration=0.2)  # duration: 滑动时间

                if time.time() > first_time + 10:  # 10s后 停止滑动
                    break

            my_element(device, PageLoginLogoutXGTW.TONGYIBENTIAOKUAN).click()

        my_assert(device, PageLoginLogoutXGTW.GERENZHONGXIN, 'exists', True, 'is_')

    else:
        raise Exception('地区传参不对:{}'.format(area_code))


def logout_xgtw(area_code: int, connect_addr: str = common_serial_number):
    """
    港澳台APP 退出方法
    :param area_code: 电话区号
    :param connect_addr:
    :return:
    """
    Log.info('执行logout_xgtw()')

    if area_code in (AreaCode.XG.value, AreaCode.TW.value):

        device = u2.connect(connect_addr)
        device.implicitly_wait(10)

        device.app_start(xgtw_app_package, stop=True)

        my_element(device, PageLoginLogoutXGTW.GERENZHONGXIN).click()
        my_assert(device, PageLoginLogoutXGTW.DANGQIANZHANGHAO, 'exists', True, 'is_')

        device.swipe_ext('up')

        my_element(device, PageLoginLogoutXGTW.XG_TUICHUDENGLU).click()
        my_element(device, PageLoginLogoutXGTW.XG_SHI).click()
        my_assert(device, PageLoginLogoutXGTW.XUANZEKUANG, 'exists', True, 'is_')

        if area_code == AreaCode.XG:
            Log.info('退出香港账号')

        else:
            Log.info('退出台湾账号')

    else:
        raise Exception('地区传参不对:{}'.format(area_code))


if __name__ == '__main__':
    pass

@filename: main.py

"""
@blog: https://blog.csdn.net/zyooooxie
"""
import pytest

from membership_interests_app_autotest.common_function import result_path
from membership_interests_app_autotest.common_function import create_allure

if __name__ == '__main__':
    pass

    # pytest.main(['-s', '-m', 'smoke', '-v', '--alluredir', '{}'.format(result_path), '--clean-alluredir'])
    pytest.main(['-s', '-v', '--alluredir', '{}'.format(result_path), '--clean-alluredir'])

    # # pytest全执行后,再去生成报告
    # create_allure()

@filename: db.ini

[hk_db]
user = zyooooxie
host = https://blog.csdn.net/zyooooxie
passwd = zyooooxie
database = zyooooxie

@filename: pytest.ini

[pytest]
markers =
    smoke: smoke test case
    cv2: cv2 test case
    screenshot: screenshot test case

本文链接:https://blog.csdn.net/zyooooxie/article/details/124415385

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值