实战 | 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
实现进入搜索页,进入股票页等操作:
base_page 模块是所有 page 类的父类,其中定义了公共方法,比如封装下面的 find 方法后,可以让子类调用 find :
from appium.webdriver.webdriver import WebDriver class BasePage: _driver: WebDriver def __init__(self, driver: WebDriver = None): self._driver = driver def find(self, locator, value: str = None): #如果传进来的是tuple,只需使用一个参数:locator if 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 Main class 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._package caps["appActivity"] = self._activity caps["noReset"] = True #初始化driver self._driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) self._driver.implicitly_wait(30) #如果driver不为空,则直接启动activity else: print(self._driver) self._driver.start_activity(self._package, self._activity) return self def restart(self): pass def stop(self): pass def main(self) -> Main: #当app启动时,跳转到(实例化)Main return Main(self._driver)
Main 模块是首页的 PageObject ,其中的方法封装了首页的重要功能,比如下面代码中的 goto_search_page 封装了点击搜索并跳转到
Search 页:
from appium.webdriver.common.mobileby import MobileBy from selenium.webdriver.common.by import By from test_appium.page.base_page import BasePage from test_appium.page.profile import Profile from test_appium.page.search import Search class Main(BasePage): #点击搜索按钮后,进入搜索页 def goto_search_page(self): self.find(MobileBy.ID, "tv_search").click() #进入搜索页 return Search(self._driver) def goto_stocks(self): pass def goto_trade(self): pass def goto_messages(self): pass
Search 模块可以搜索一支股票,还可以获取股票的价格,比如下图:
封装代码如下:
from appium.webdriver.common.mobileby import MobileBy from selenium.webdriver.remote.webdriver import WebDriver class Search: _driver: WebDriver def __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 pytest from test_appium.page.app import App class 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
以上,供大家参考,欢迎一起留言探讨。
**相关文章
**
- UI 自动化测试应不应该投入?有没有前途?怎样做最明智?
- 实战 | UI 调度自动化测试平台(基于 Python)
- Page Object 模式很火,UI 自动化测试到底要不要用?怎么用?
- PageObject(PO)设计模式在 UI 自动化中的实践总结(以 QQ 邮箱登陆为例)
**
来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web自动化测试 app自动化测试、接口自动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全面提升测试开发工程师的技术实力
QQ交流群:484590337
公众号 TestingStudio
更多内容欢迎访问 https://ceshiren.com
测试人社区
视频资料领取:https://qrcode.testing-studio.com/f?from=CSDN&url=https://ceshiren.com/t/topic/15844
点击查看更多信息
实战 | UI 自动化测试框架设计与 PageObject 改造相关推荐
- Appium PO模式UI自动化测试框架——设计与实践
阅读目录 1. 目的 2. 意义 3. 设计理念 4. PO模式 5. 框架设计 5.1 目录结构 5.2 实现步骤 5.3 具体实现 5.3.1 base部分 5.3.2 po部分 5.3.3 te ...
- python3.7界面设计_基于selenium+Python3.7+yaml+Robot Framework的UI自动化测试框架
前端自动化测试框架 项目说明 本框架是一套基于selenium+Python3.7+yaml+Robot Framework而设计的数据驱动UI自动化测试框架,Robot Framework 作为执行 ...
- python接口自动化测试框架实战从设计到开发_【B0753】[java视频教程]Python接口自动化测试框架设计到开发完整版视频教程 it教程...
Java视频教程名称:Python接口自动化测试框架设计到开发完整版视频教程 java自学网[javazx.com] Python视频教程 it教程 Java自学网收集整理 java论坛&q ...
- unity之游戏UI界面框架设计实战学习(一)
游戏UI界面框架设计实战精讲视频课程 配合上博客 刘老师讲Unity 刚开始接触UI界面. 觉得讲得非常好. 做一下笔记. 课程总体分为七大部分: 一: UI框架设计理念 整体简单介绍即将带领大家开发 ...
- 一套完整的Selenium自动化测试框架设计实战,这次38K, 妥了
金九银十,大家都铆足干劲想抓住机会涨薪进大厂.结合这几年的行业趋势,想要挑战大厂面试,首先必须吃透Selenium自动化测试框架设计. 这里说一下原因: 首先,一线互联网大厂无一例外,全都要求测试人掌 ...
- 《精通自动化测试框架设计》—第2章 2.3节测试数据交互基本方法
本节书摘来自异步社区<精通自动化测试框架设计>一书中的第2章,第2.3节测试数据交互基本方法,作者陈冬严 , 邵杰明 , 王东刚 , 蒋涛,更多章节内容可以访问云栖社区"异步社区 ...
- 《精通自动化测试框架设计》目录—导读
作者简介 精通自动化测试框架设计 陈冬严,浙江大学硕士,具有10年软件测试和团队管理的工作经验,先后服务于ITSM.PLM软件研发企业,现就职于某金融行业核心机构IT规划部门.业余时间喜欢园艺. 邵杰 ...
- 整装待发 QTA UI自动化测试框架迎来大更新
2019独角兽企业重金招聘Python工程师标准>>> 整装待发 QTA UI自动化测试框架迎来大更新 QTA是什么 QTA是一个跨平台的测试自动化工具,适用于后台.原生或混合型客户 ...
- python接口自动化测试框架pdf,Python接口自动化测试框架设计到开发完整版2019
1:课程详细介绍.mp4 ; k& X* V: X! X% \; ]; u- V$ z7 L) h: C; h2:课程答疑.mp4+ J K* q0 O x + j( v2 n7 B7 s ...
最新文章
- flexbox 伸缩布局
- edittext实现自动查询,刷新listview
- 开源 非开源_开源突破“舒适区”
- python中堆排序_Python实现堆排序的方法详解
- Java常见的垃圾收集器GC算法整理
- 2.从Paxos到Zookeeper分布式一致性原理与实践---一致性协议
- 不讲武德,Java分布式面试题集合含答案!
- 从零开始搭建物联网平台(三)数模设计
- 软文诊断50期: 百度账号有什么推广功能?能编辑软文吗?
- 恶意代码防范技术原理-计算机病毒和特洛伊木马分析与防护
- PTA 顺序结构 7-3 计算代数表达式
- OSChina 周三乱弹 ——你是有多寂寞啊,看光头强都……
- python 表格处理项目该如何分工_python 处理 Excel 表格
- 删除IE加载项及取消加载项的提示
- 《高性能iOS 应用开发》之降低你 APP 的电量消耗
- 80核处理器_最受欢迎的处理器 酷睿i5-9400F果然霸榜了
- Ultraiso制作Centos7 优盘Udisk 启动镜像
- 如何使用Tableau进行预测分析
- 纳米软件分享:电子测量行业仪器必备测试软件合集分享
- SMI-S 统一SAN管理
热门文章
- http://jingyan.baidu.com/article/0eb457e5208cbb03f0a9054c.html
- 富文本编辑器 Kindeditor 的使用和 常见错误
- sql语句(基础篇)
- Java的编程之旅——idea上新建文件
- 数学建模篇---2022国赛C题(一)
- 3.1 该如何编写程序界面
- children和childNodes 的区别
- 夯实基础 js数据类型
- mysql oracle创建视图索引吗_Oracle视图,索引,序列
- python 线程thread详解