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.mzph.cn/news/155404.shtml

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

相关文章

webpack 创建typescript项目

【视频链接】尚硅谷TypeScript教程(李立超老师TS新课) 创建webpack 项目 IDE:webstorm 新建一个空的项目运行npm init初始化项目目录结构 1. 安装 webpack:构建工具webpack-cli: webpack的命令行工具typescript&am…

单链表在线OJ题(详解+图解)

1.删除链表中等于给定值 val 的所有节点 本题的要求是输入一个val的整形值,若链表中节点存储的值与val相等,则删除这个节点,并最后返回这个删除节点后的链表,思路如下: 我们可以直接使用while循环,并且使用…

SAP gui 登录条目不让修改

今天碰到用户安装的GUI 770 版本,不让修改,也不让添加 后面再选项里面找到了

安防监控视频云存储平台EasyCVR页面播放卡顿的优化方法

视频监控平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视…

ky10 server aarch64 离线安装openssl3.1.4

离线程序 https://gitcode.net/zengliguang/ky10_aarch64_openssl_install.git 输入下面命令执行离线安装脚本 source openssl_offline_install.sh 安装完成

郎酒“掉队”,经销商们能等来春天吗?

文 | 螳螂观察(TanglangFin) 作者 | 渡过 有“六朵金花”之称的川酒品牌中,五粮液、泸州老窖、舍得、水井坊都已成功上市,只剩下郎酒和剑南春未上市。 与IPO的“掉队”相对应的,是郎酒在冲刺高端、内部管理、渠道管…

安全领航,共筑敏捷开发新时代【云驻共创】

安全领航,共筑敏捷开发新时代。网络安全形势虽然严峻,但得益于企业安全意识的提升,近两年来遭受网络攻击的网站不断减少,普通网民的个人隐私及其他敏感数据得到了更多的保证。华为云基于自身多年的安全经验研发了可以帮助开发者实…

(一)pytest自动化测试框架之生成测试报告(mac系统)

前言 我们可以通过pytest-html插件来生成测试报告,但是pytest-html插件生成的测试报告不够美观,逼格也不够高,通过allure生成的测试报告是比较美观的,花里胡哨的,能够提升一个level。 allure官网: Allure…

布尔类型的转换

1.图示 2.说明 空数组[]和空对象{}都是Object类型,因此直接用于if判断条件时都会被转化为true。任意值与布尔值比较,都会将两边的值转化为Number。如果将空数组[ ]与布尔值false比较,false转化为0,而空数组[ ]转化为0&#xff0c…

【算法之路】高精度算法(实现加减乘除)

目录 一、高精度概念 二、高精度算法的实现 1、高精度加法(大整数相加) 2、高精度减法(大整数减法) 3、高精度乘法(大整数*小整数) 4、高精度除法(大整数/小整数) 一、高精度概…

Java GUI实现桌球小游戏

桌球游戏是一种室内运动,通常在一个正式的桌球台上进行。这种游戏也被称为台球或母球。桌球游戏的目标是使用一个击球杆将彩球击入桌面四个角落的袋子中,得分最高的一方获胜。桌球游戏需要一定的技巧和策略,因此是一项受欢迎的竞技运动和休闲…

生成对抗网络Generative Adversarial Network,GAN

Basic Idea of GAN Generation(生成器)  Generation是一个neural network,它的输入是一个vector,它的输出是一个更高维的vector,以图片生成为例,输出就是一张图片,其中每个维度的值代表生…

前端环境变量释义

视频教程 彻底搞懂前端环境变量使用和原理,超清楚_哔哩哔哩_bilibili 添加命令行参数 --modexxxxx 新建.env.xxxx文件,其中.env文件会在所有环境下生效 以VITE_开头,字符串无需加双引号 使用import.meta.env.VITE_xxxxx进行调用

React中封装echarts图表组件以及自适应窗口变化

文章目录 前言环境代码接口使用效果后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:react.js 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,…

很多人都在用的现货白银突破交易法 缺点需要注意

突破交易是现货白银投资者常用的交易技巧。通常做突破交易有两种方法,一种是突破发生的时候马上入场,另一种是在突破确认后等待回调然后再入场。目前,投资者较多的是使用后者。用突破——回踩入场有什么优缺点呢?下面我们就来讨论…

Java(四)(多态,final,常量,抽象类,接口)

目录 多态 基本概念: 使用多态的好处 类型转换 遇到的问题 解决方法 强制类型转换的一个注意事项 final 常量 抽象类 啥是个抽象类? 抽象类的注意事项,特点 抽象类的场景和好处 抽象类的常见应用场景: 模板方法设计模式 接口 基本概念 接口的好处 JDK8开始,接…

[计算机网络实验]头歌 实验二 以太网帧、IP报文分析

第1关:Wireshark基本使用入门 【实验目的】 1、掌握wireshark工具的基本使用方法 【实验环境】 1、头歌基于Linux的虚拟机桌面系统 2、网络报文分析工具wireshark 3、浏览器firefox 【本地主机、平台虚拟机之间数据传递】 1、文本的复制与粘贴 操作入口&…

半导体业库存问题缓解,明年迎来良好转机 | 百能云芯

随着全球半导体产业今年产值预计将出现逾1成的衰退,市场一度陷入不确定性。然而,半导体厂商们对于供应链库存的有效去化表示乐观,预计将为明年带来健康的复苏。在各种因素交织的复杂情况下,半导体产业展现出逐步解决库存问题、迎来…

vivado产生报告阅读分析14-时序报告10

Vivado IDE 中的例外报告 “ Report Exceptions ”对话框 在 AMD Vivado ™ IDE 中 , 选择“ Reports ” → “ Timing ” → “ Report Exceptions ” ( 报告 > 时序 > 例外报告 ) 即可打开“Report Exceptions ”对话框。 从“…