修改了 BeautifulReport源码中的一些内容<附:BeautifulReport--适用于unittest自动化测试的可视化报告>;

1.生成截图时,原来的img文件夹必须在项目根目录下,做了调整;

2.生成的截图无法在html报告上展示,老是会报路径错误,检查发现源码中在做判断时少加了system()方法才导致错误的出现;

源码github截图

修改后截图

简单的登录功能实现,懂车帝app为例;

1.页面元素封装;

page_car.py
from common.basics import Crazyclass CarLoginPage(Crazy):"""元素定位"""# 跳过广告skip_loc = ('id', 'com.ss.android.auto:id/c8r')def click_skip(self):self.click(self.skip_loc)tag_loc = ("id", "com.ss.android.auto:id/bqp")# 首页文本def text_home(self):return self.get_texts(self.tag_loc, 0)# 是否未 登录def text_landed(self):return self.get_texts(self.tag_loc, 3)# 进入 未登录(我的)页面def click_landed(self):self.clicks(self.tag_loc, 3)# # 判断是否进入未登录(我的)页  设置  编辑资料common_loc = ('id', 'com.ss.android.auto:id/dd')def text_common(self):return self.get_text(self.common_loc)# 点击手机图标phone_loc = ('id', 'com.ss.android.auto:id/brg')def click_phone(self):self.click(self.phone_loc)# 判断是否进入手机登录页面phone_login_loc = ('id', 'com.ss.android.auto:id/jv')def text_phone_login(self):return self.get_text(self.phone_login_loc)# 输入手机号_phone_loc = ('id', 'com.ss.android.auto:id/jy')def input_phone(self, phone):self.send_keys(self._phone_loc, phone)# 点击获取验证码verification_code_loc = ('id', 'com.ss.android.auto:id/jz')def click_verification_code(self):self.click(self.verification_code_loc)# 输入验证码input_verification_code_loc = ('id', 'com.ss.android.auto:id/k3')def input_verification(self, code):self.send_keys(self.input_verification_code_loc, code)# 点击 进入app 按钮into_btn_loc = ('id', 'com.ss.android.auto:id/k7')def click_into_btn(self):self.click(self.into_btn_loc)# QQ登录qq_loc = ('id', 'com.ss.android.auto:id/brh')def click_qq(self):self.click(self.qq_loc)# 授权按钮# grant_btn_loc = ('id', 'com.tencent.mobileqq:id/name') [36,1418][1044,1538]# grant_btn_loc = [(36, 1301), (1044, 1421)]grant_btn_loc = [(36, 1418), (1044, 1538)]def click_grant_btn(self):self.click_coordinate(self.grant_btn_loc)# 判断登录成功personal_center_loc = ('id', 'com.ss.android.auto:id/br3')def text_personal_center(self):return self.get_text(self.personal_center_loc)# 微信登录wechat_loc = ('id', 'com.ss.android.auto:id/bri')def click_wechat(self):self.click(self.wechat_loc)# 确认登录 [42,1176][1038,1320] com.tencent.mm:id/ch6  [39,1079][1041,1211] [42,1176][1038,1320]confirm_wechat_loc = [(42, 1176), (1038, 1320)]def click_confirm_wechat(self):self.click_coordinate(self.confirm_wechat_loc)# 退出操作set_up_loc = ('id', 'com.ss.android.auto:id/bvb')def click_set_up(self):self.click(self.set_up_loc)# 判断进入设置页 text_common# 退出按钮logout_loc = ('id', 'com.ss.android.auto:id/c7o')def click_logout(self):self.click(self.logout_loc)# 是否存在退出按钮def element_logout(self):return self.find_element(self.logout_loc)# 退出确认logout_confirm_loc = ('id', 'com.ss.android.auto:id/i3')def text_logout_confirm(self):return self.get_text(self.logout_confirm_loc)# 确认退出confirm_logout_loc = ('id', 'com.ss.android.auto:id/c9_')def click_confirm_logout(self):self.click(self.confirm_logout_loc)# 修改资料update_user_loc = ('id', 'com.ss.android.auto:id/br5')def click_update_user(self):self.click(self.update_user_loc)# 用户名user_name_loc = ('id', 'com.ss.android.auto:id/j_')def click_user_name(self):self.click(self.user_name_loc)# 请输入用户名 titleenter_user_loc = ('id', 'com.ss.android.auto:id/ali')def text_enter_user(self):return self.get_text(self.enter_user_loc)# 修改用户名input_user_loc = ('id', 'com.ss.android.auto:id/alj')def input_user(self, name):self.send_keys(self.input_user_loc, name)# 确定按钮enter_btn_loc = ('id', 'com.ss.android.auto:id/alm')def click_enter_btn(self):self.click(self.enter_btn_loc)# 获取用户名称get_user_name_loc = ('id', 'com.ss.android.auto:id/jc')def text_get_user_name(self):return self.get_text(self.get_user_name_loc)

basics.py 是用显示等待封装的一些常用方法<附:基于显示等待封装的一些常用方法>;在做授权操作时,需要使用坐标定位的方法实现点击操作;剩下的就是页面主要元素的函数;

2.测试用例;

test_car.py

import unittest
import time
from BeautifulReport import BeautifulReport
from page.page_car import CarLoginPage
from common.logger import Log
from common.basics import open_app
from common import readConfigclass TestCar(unittest.TestCase):@classmethoddef setUpClass(cls):cls.driver = open_app()cls.log = Log()cls.car = CarLoginPage(cls.driver)# cls.img_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'report\img')cls.img_path = readConfig.img_path  # 必须是这个路径
@classmethoddef tearDownClass(cls):cls.driver.close_app()def save_img(self, img_name):self.driver.get_screenshot_as_file('{}/{}.png'.format(self.img_path, img_name))@BeautifulReport.add_test_img('test_1app')def test_1app(self):"""打开app测试用例"""car = self.car# car.click_skip()  # 跳过广告self.assertEqual('首页', car.text_home(), '进入app出错!')self.log.info('进入app成功!')@BeautifulReport.add_test_img('QQ登录')def test_2qq(self):"""QQ登录测试用例"""car = self.carif car.text_landed() == '我的':car.click_landed()self.sign_out()if car.text_landed() == '未登录':self.log.info('用户未登录,准备 QQ 用户登录中...')car.click_landed()self.assertEqual(car.text_common(), '常用功能', '未进入 未登录 页面!')self.log.info('选择 QQ 用户登录.')car.click_qq()time.sleep(2)car.click_grant_btn()time.sleep(2)self.assertEqual(car.text_personal_center(), '个人主页', 'QQ 用户登录失败!')self.log.info('QQ 用户登录成功!')self.save_img('QQ登录')@BeautifulReport.add_test_img('微信登录')def test_2wechat(self):"""微信登录测试用例"""car = self.carif car.text_landed() == '我的':car.click_landed()self.sign_out()if car.text_landed() == '未登录':self.log.info('用户未登录,准备 微信 用户登录中...')car.click_landed()self.assertEqual(car.text_common(), '常用功能', '未进入 未登录<我的> 页面!')self.log.info('选择 微信 用户登录.')car.click_wechat()time.sleep(2)if car.text_personal_center() == '个人主页':self.log.info('微信 用户登录成功!')else:car.click_confirm_wechat()time.sleep(2)self.assertEqual(car.text_personal_center(), '个人主页', '微信 用户登录失败!')self.log.info('微信 用户登录成功1!')self.save_img('微信登录')@BeautifulReport.add_test_img('编辑资料')def test_4update_user_info(self):"""编辑用户资料"""car = self.carif car.text_landed() == '未登录':self.log.warning('未检测到用户登录,不能进行编辑资料操作!')elif car.text_landed() == '我的':self.log.info('用户已登录,准备进行 编辑资料 操作.')car.click_landed()car.click_update_user()self.assertEqual(car.text_common(), '编辑资料', '出现错误,没有进入 编辑资料 页面!')start_user = car.text_get_user_name()car.click_user_name()car.input_user('111')car.click_enter_btn()end_user = car.text_get_user_name()self.save_img('编辑资料')time.sleep(2)if start_user == end_user:self.log.info('用户名称未做修改.')else:self.log.info('修改用户名称成功!修改后的名称:{}'.format(end_user))# def test_3phone(self):#     """手机登录"""#     car = self.car#     if car.text_landed() == '我的':#         car.click_landed()#         self.sign_out()#     if car.text_landed() == '未登录':#         self.log.info('用户未登录,准备 手机 用户登录中...')#         car.click_landed()#         self.assertEqual(car.text_common(), '常用功能', '未进入 未登录<我的> 页面!')#         self.log.info('选择 手机 用户登录.')#         car.click_phone()#         self.assertEqual(car.text_phone_login(), '手机快捷登录', '进入 手机快捷登录 页面失败!')#         car.input_phone('xxxxxxxxxxx')#         time.sleep(1)#         car.click_verification_code()#         time.sleep(2)#         car.input_verification('5556')#         car.click_into_btn()#         self.assertEqual(car.text_personal_center(), '个人主页', '手机 用户登录失败!')#         self.log.info('手机 用户登录成功!')
@BeautifulReport.add_test_img('退出登录')def sign_out(self):"""用户退出"""car = self.carif car.text_common() == '常用功能':self.assertEqual(car.text_personal_center(), '个人主页', '没有用户登录,无法退出!')self.log.info('正在执行用户退出登录操作.')car.click_set_up()self.assertEqual(car.text_common(), '设置', '进入设置页面失败!')self.log.info('进入设置页成功!')car.click_logout()self.assertEqual(car.text_logout_confirm(), '退出确认', '出现错误,没有发现退出确认弹框!')car.click_confirm_logout()if not car.element_logout():self.log.info('退出登录成功!')self.save_img('退出登录')car.back()else:self.log.info('当前不在 我的 页面,无法进行退出登录操作!')if __name__ == '__main__':unittest.main()

CarLoginPage,元素类;Log方法,打印日志<附:python logging模块 输出日志和过期清理>;open_app方法,连接appium,启动被测app;readConfig方法,配置文件;手机登录的就比较蛋疼了,试了根据adb logcat获取手机日志,提取验证码没有成功...


生成的截图和html报告:1.每条用例都会生成一张截图,错误截图另算;

2.html报告;

错误case截图

正常case截图

转载于:https://www.cnblogs.com/changqing8023/p/10153371.html

BeautifulReport 实现app UI自动化测试相关推荐

  1. 阿里p8呕心沥血整理出来的,APP UI自动化测试思路总结,速看

    首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师.高级测试工程师岗位招聘信息上要求的,所以为了更好的待遇,我们还是需要花时间去掌握的,毕竟谁也不会跟钱过不去.接下来,一 ...

  2. APP UI自动化测试:框架选择、环境搭建、脚本编写……全总结

    首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师.高级测试工程师岗位招聘信息上要求的,所以为了更好的待遇,我们还是需要花时间去掌握的,毕竟谁也不会跟钱过不去. 接下来, ...

  3. Appium APP UI自动化测试框架介绍

    APP UI自动化测试同样可以使用unittest框架,与web的UI自动化类似 整个自动化流程介绍 1) 会先从手工用例里面抽离出要做自动化的用例,在测试用例里面会加一个执行方式的标签,标明是手动还 ...

  4. 华为APP UI自动化测试岗面试真题,真实面试经历。

    1.Android APP 内存不足时,如何获得内存? 系统优先结束被挂起(暂停)的进程,释放内存. 2.APP 测试常见问题有哪些?原因有哪些? 常见的有 crash.ANR(应用无响应.卡死),一 ...

  5. APP UI自动化测试常见面试题,或许有用呢~

    1.Android APP 内存不足时,如何获得内存? 系统优先结束被挂起(暂停)的进程,释放内存. 2.APP 测试常见问题有哪些?原因有哪些? 常见的有 crash.ANR(应用无响应.卡死),一 ...

  6. Android app UI自动化测试 常用的元素定位方法

    本文简要介绍了移动端Android APP进行UI自动化测试时,常用到的元素定位方法 目录 前言 一.通过resource-id定位 二.通过class name定位 三.通过accessibilit ...

  7. Appium APP UI自动化测试简介与环境搭建

    一. app自动化测试背景 移动终端越来越多,手机应用也越来越多 App回归测试用例越来越多,但全量回归很消耗时间 移动端碎片化严重,尤其是Android端(兼容性就是碎片化的体现,有很多厂商.机型. ...

  8. APP UI 自动化测试 H5页面元素定位

    使用 uc-devtools 代替 uiautomatorviewer 查找定位H5元素 由于uiautomatorviewer 只能定位APP原生页面: 所以要定位app H5 页面内的元素 使用 ...

  9. APP UI 真的可以实现自动化测试吗?

    本文来自作者 我是坏蛋 在 GitChat 上分享「论 APP UI 自动化测试的可行性」,「阅读原文」查看交流实录 「文末高能」 编辑 | 家辉 背 景 在这个科技时代,app 数量也是逐年递增,只 ...

最新文章

  1. 开源 免费 java CMS - FreeCMS1.2-功能说明-网上调查
  2. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第10章-基于模型预测控制的人机协同控制
  3. 面试 4 个月,最终入职大厂经验分享!
  4. android sharedUserId 共享用户
  5. mysql--------四种索引类型
  6. ES2019 的新功能 flat()
  7. python做oa系统_浅谈python进行webapp,oa系统开发 (更新中) | 学步园
  8. erp系统源码php_最新仿金蝶 PHP电商ERP进销存系统软件 带扫描功能
  9. 用Android Studio做一个超好玩的拼图游戏,附送超详细注释的源码
  10. PAIP.MYSQL 1045 Access denied for user 'XXXX'@'loca 的解决.txt
  11. 软件项目文档——WBS
  12. 湿空气性质计算,随笔与学习记录 (4.空气比容,空气密度)
  13. 微信小程序服装商城+后台管理系统
  14. 服务器状态监控,LOL服务器状态监控
  15. python实现sorted函数_Python sorted函数及用法
  16. IE下载时中文文件名乱码解决
  17. 某金融企业核心存储POC测试及选型经验
  18. [NWERC 2019] E. Expeditious Cubing 浮点数精度判断
  19. 乐优商城之品牌新增fastDFS(九)
  20. J276-删除链表中重复的节点

热门文章

  1. 什么蓝牙耳机打游戏好用?游戏蓝牙耳机品牌推荐
  2. php 获取所有的下级组织,树形结构 查找上下级
  3. nodejs爬取蜻蜓fm的歌曲
  4. 哈尔滨市建筑物矢量数据(Shp格式+带高度)
  5. 获取站点真实IP地址-多地点Ping方法
  6. 附完整python源码)基于tensorflow、opencv的入门案例_发票识别一:关键区域定位
  7. warning C4996: 'strcpy'解决方法
  8. scracth 好玩的迷宫游戏
  9. python语音识别_Python中的语音识别-完整的入门指南
  10. 本地window系统创建定时任务 定时执行任务