UI 自动化测试框架设计与 PageObject 改造!

在 UI 自动化测试过程中,面对复杂的业务场景,经常会遇到这样的挑战:

  • 简单的录制/回放速度快,但无法适应复杂场景;
  • 编写自动化测试脚本比较灵活,但工作量大且可维护性差;
  • 以往的封装技术(PageObject)可以适应各种 UI 场景,但结构松散,无法在多项目中迁移;

因此,测试团队通常还需要一种定制测试框架,用以弥补现有框架的缺点。

测试框架封装思想

由于 UI 自动化测试框架围绕 UI 界面使用,因此,依旧选用 PageObject 设计模式对 UI 及测试进行封装,同时配合 Pytest 单元测试将脚本能够有效的组织、连贯应用起来,从而提高框架的可维护性和可读性。

由于测试框架基于 PageObject 设计模式,主要方向为 PO 改进,数据驱动,异常处理等,比如:

  • 测试数据的数据驱动:将数据存储到外部 yaml 文件中,利用 yaml 工具进行数据读取;
  • 数据步骤的数据驱动:将操作步骤放到外部 yaml 文件中,利用 yaml 工具对操作步骤进行读取,用专门函数解析并实现操作步骤;
  • 自动化异常处理机制:对元素查找模块进行封装和改进,包括如何处理弹窗;

Page_Object 改造

作为通用的 UI 测试框架, PageObjet 不仅适用于 Web 自动化测试,也可适用 Appium 移动自动化测试,其优点如下:

  • 减少代码重复
  • 提高测试用例可读性
  • 提高测试用例可维护性

PO 改造实例(基于雪球 App)

本案例将对雪球 App 进行 Page Objetct 封装与改进。

当启动雪球 App 时,会进入首页。点击搜索框进入搜索页,搜索某支股票然后判断股价是否大于 200:

PageObjetct 的模块关系如下,所有的模块要继承 BasePage , App 实现启动,重启,停止等操作, Main 实现进入搜索页,进入股票页等操作:

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

base_page 模块是所有 page 类的父类,其中定义了公共方法,比如封装下面的 find 方法后,可以让子类调用 find :

from appium.webdriver.webdriver import WebDriverclass BasePage:_driver: WebDriverdef __init__(self, driver: WebDriver = None):self._driver = driverdef find(self, locator, value: str = None):#如果传进来的是tuple,只需使用一个参数:locatorif isinstance(locator, tuple):return self._driver.find_element(*locator)else:return self._driver.find_element(locator, value)

App 模块封装 app 的启动,重启,停止等方法,当 app 启动时会进入 main 页面,因此在下面的 main 方法要 return Main ,Main 类的定义在后面会讲解:

from appium import webdriver
from test_appium.page.base_page import BasePage
from test_appium.page.main import Mainclass App(BasePage):#指定app的包名和activity名_package = "com.xueqiu.android"_activity = ".view.WelcomeActivityAlias"def start(self):#如果driver为空则初始化if self._driver is None:caps = {}caps["platformName"] = "android"caps["deviceName"] = "hogwarts"caps["appPackage"] = self._packagecaps["appActivity"] = self._activitycaps["noReset"] = True#初始化driverself._driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)self._driver.implicitly_wait(30)#如果driver不为空,则直接启动activityelse:print(self._driver)self._driver.start_activity(self._package, self._activity)return selfdef restart(self):passdef stop(self):passdef main(self) -> Main:#当app启动时,跳转到(实例化)Mainreturn Main(self._driver)

Main 模块是首页的 PageObject ,其中的方法封装了首页的重要功能,比如下面代码中的 goto_search_page 封装了点击搜索并跳转到 Search 页:

from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.common.by import Byfrom test_appium.page.base_page import BasePage
from test_appium.page.profile import Profile
from test_appium.page.search import Searchclass Main(BasePage):#点击搜索按钮后,进入搜索页def goto_search_page(self):self.find(MobileBy.ID, "tv_search").click()#进入搜索页return Search(self._driver)def goto_stocks(self):passdef goto_trade(self):passdef goto_messages(self):pass

Search 模块可以搜索一支股票,还可以获取股票的价格,比如下图:

封装代码如下:

from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.remote.webdriver import WebDriverclass Search:_driver: WebDriverdef __init__(self, driver):self._driver = driver#输入要搜索的内容def search(self, key: str):self._driver.find_element(MobileBy.ID, "search_input_text").send_keys(key)self._driver.find_element(MobileBy.ID, "name").click()return self#获取股票价格,用于判断def get_price(self, key: str) -> float:return float(self._driver.find_element(MobileBy.ID, "current_price").text)

最后对上述代码建立测试,新建测试模块 test_search :

import pytestfrom test_appium.page.app import Appclass TestSearch:def setup(self):self.main = App().start().main()def test_search(self):assert self.main.goto_search_page().search("alibaba").get_price("BABA") > 200

以上,供大家参考,欢迎一起留言探讨。

END点赞关注不迷路!   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/197256.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16路模拟信号转RS-485/232,Modbus RTU 通讯协议数据采集24位A/D转换模块 YL29

特点: ● 16路模拟信号采集,隔离转换 RS-485/232输出 ● 采用24位AD转换器,测量精度优于0.05% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围:8 ~ 32VDC ● 可靠性高…

51Sim-One安装手册

 产品安装手册 产品安装手册 关于本文档 本文档主要提供了和产品安装相关的信息以及步骤,能帮助用户更加顺畅的完成产品的安装部署工 作。 系统要求 操作系统 Windows Windows 10 专业版 64bit Windows 10 企业版 64bit Linux Ubunut 18.04 浏…

CLIP浅谈

CLIP论文地址:Learning Transferable Visual Models From Natural Language Supervision CLIP代码地址:https://github.com/openai/CLIP 简介 CLIP是OpenAI在2021年2月发表的一篇文章,它的主要贡献有以下2点: 1)将图…

元宇宙外科手术vrar仿真实验室平台提高了培训效率和安全性

在科研与教育的领域中,实验室的作用举足轻重。然而,传统实验室受限于时间、空间、资源等因素,难以满足日益增长的科研与教育需求。在这一背景下,3D元宇宙仿真实验室应运而生,以其独特的优势,成为科研与教育…

深兰科技成功入选《2023年度国家知识产权优势企业名单》

2023年11月13日,国家知识产权局正式公布了《2023年度国家知识产权优势企业的名单》(以下简称“《名单》”)。深兰人工智能科技(上海)股份有限公司成功入选,荣获“国家知识产权优势企业”称号。 “国家知识产权优势企业”是指企业经营范围属于国家重点发展…

【文末送书】计算机网络 | IO多路转接技术 | poll/epoll详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

Three.js相机模拟

有没有想过如何在 3D Web 应用程序中模拟物理相机? 在这篇博文中,我将向你展示如何使用 Three.js和 OpenCV 来完成此操作。 我们将从模拟针孔相机模型开始,然后添加真实的镜头畸变。 具体来说,我们将仔细研究 OpenCV 的两个失真模型,并使用后处理着色器复制它们。 拥有逼…

Rocky Linux Download

前言 Rocky Linux 是一个社区企业操作系统,旨在与美国顶级企业 Linux 发行版 100% 逐个 bug 兼容,因为其下游合作伙伴已经转移方向。它正在社区的密集开发中。Rocky Linux 由 CentOS 项目的创始人 Gregory Kurtzer 领导。贡献者被要求使用本网站上提供的…

(论文阅读51-57)图像描述3 53

51.文献阅读笔记(KNN) 简介 题目 Exploring Nearest Neighbor Approaches for Image Captioning 作者 Jacob Devlin, Saurabh Gupta, Ross Girshick, Margaret Mitchell, C. Lawrence Zitnick, arXiv:1505.04467 原文链接 http://arxiv.org/pdf/1…

我们为什么要做亚马逊测评?

提高页面权重 一般页面有三个部分构成 标题,关键词,描述 review 可以很好地充当一个描述的角色,为页面提升权重 我们会发现有些评论全部是视频,但是却可以推他的关键词到他的首页,因为视频带来的权重是最高的&…

CRM按行业细分的重要性

很多企业和销售会诟病CRM系统不够贴合行业、功能也不够细分和实用。因为各行各业的业务千差万别,所以功能完备、使用满意度高的CRM一定是与不同行业业务场景高度匹配的,是深度行业化的。因此行业化是CRM发展的重要趋势之一,为什么CRM一定要走…

Wireshark网络工具

Wireshark是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。 Wireshark是一个免费开源软件,不需要付费,免费使用,可以直接登陆到Wireshark的官网下载安装。 在windows环境中&#x…