本文为博主原创,未经授权,严禁转载及使用。
本文链接: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