说说UI自动化中的PO模式
PO模式,全称PageObject模式,即页面对象模式。将页面定位与业务操作分离。
po模式有以下几个优点:
1.易读性好
2.扩展性高
3.复用性强
4.维护性好
5.代码冗余率低
了解了po模式及po模式的优点,可po模式在实际项目中到底该怎么做呢?接下来我们就来看看:
在本篇中我将po模式分为三层,分别是页面定位层,页面对象层,业务逻辑层;我将对每层逐一介绍。
一、页面定位层:每个页面作为一个模块,将页面元素定位表达式统一存放在该页面

例:登录页面模块部分代码如下
from selenium.webdriver.common.by import By
class LoginPageLoc:
# 用户名输入框
user_loc = (By.XPATH, '//input[@name="phone"]')
# 密码输入框
passwd_loc = (By.XPATH, '//input[@name="password"]')
# 登陆按钮
login_button_loc = (By.TAG_NAME, "button")
# 错误提示框
form_error_loc = (By.XPATH, '//div[@class="form-error-info"]')
# 页面中dialog的提示
dialog_error_loc = (By.XPATH, '//div[@class="layui-layer-content"]')
二、页面对象层:存放每个页面对象操作

例:登录页面的登录、获取错误信息等操作
from PageLocators.login_page_loc import LoginPageLoc as loc
from Common.basepage import BasePage
# 说明,本框架对selenium库中通用的元素行为方法做了二次封装(添加日志与截图),因此继承封装后的模块basepase class LoginPage(BasePage):
# 元素操作 # 登录操作
def login(self,username,passwd):
self.input_text(loc.user_loc,username,"登录页面_用户名输入")
self.input_text(loc.passwd_loc,passwd,"登录页面_密码输入")
self.click_element(loc.login_button_loc,"登录页面_点击登录按钮") # 获取提示信息
def get_error_msg(self):
return self.get_element_text(loc.form_error_loc,"登录页面_表单区域错误提示") # 获取页面中的错误提示信息
def get_error_msg_from_dialog(self):
return self.get_element_text(loc.dialog_error_loc,"登录页面_页面中间toast错误提示")
三、业务逻辑层:组合业务操作,即编写测试用例

例:登录功能,登录成功测试用例
@ddt.ddt
class TestLogin(unittest.TestCase): def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.get(CD.login_url)
self.lp = LoginPage(self.driver) def tearDown(self) -> None:
self.driver.quit() # 正常场景 - 登录成功。
def test_login_success(self):
logging.info("******* 登录功能 - 正常场景用例:登录成功 *******")
# 调用登录页面的登录行为。
self.lp.login(LD.success_data["user"], LD.success_data["passwd"])
# 断言 - 首页当中,应该存在 退出元素。
self.assertTrue(HomePage(self.driver).check_user_exist())
# 断言2 - 首页url地址
self.assertEqual(self.driver.current_url,LD.success_data["check_url"])
登录成功用例较简单,未涉及过多流程和元素操作,可以看看下面一个投资成功的测试用例:
@ddt.ddt
class TestInvest(unittest.TestCase): def setUp(self) -> None:
# 1、(前置)登陆页面登陆;
self.driver = webdriver.Chrome()
self.driver.get(CD.login_url)
LoginPage(self.driver).login(CD.user,CD.passwd)
# 2.首页选标,选择页面第一个标(默认此标符合此次用例投资标准)
HomePage(self.driver).click_first_bid()
self.bp = BidPage(self.driver) def tearDown(self) -> None:
self.driver.quit() # 正常场景 - 投资成功
def test_invest_success(self):
logging.info("******* 投资功能 - 正常场景用例:投资1000元成功。用户可用余额减少1000,标余额减少1000 *******")
# 3、标页面获取用户余额;
user_money_before_invest = self.bp.get_user_money()
# 4、标页面获取 标的余额;
bid_money_before_invest = self.bp.get_bid_left_money()
# 5、标页面:投标动作;
self.bp.invest(ID.success["money"])
# 6、点击投标成功提示框当中:查看并激活按钮
self.bp.click_activeButton_on_success_popup()
# 7、个人页面:获取用户余额
user_money_after_invest = UserPage(self.driver).get_user_left_money()
# 8、回退到标页面、刷新后:再次获取标的余额
self.driver.back()
self.driver.refresh()
bid_money_after_invest = self.bp.get_bid_left_money()
# 9、断言
self.assertEqual(ID.success["money"],int(float(user_money_before_invest) - float(user_money_after_invest)))
self.assertEqual(ID.success["money"],int((float(bid_money_before_invest) - float(bid_money_after_invest))*10000))
关于自动化中的PO模式,大概就讲这么多啦。。。O(∩_∩)O~
做一棵小草,谁也撼动不了………
说说UI自动化中的PO模式的更多相关文章
- UI自动化学习笔记- PO模型介绍和使用
一.PO模型 1.PO介绍:page(页面) object(对象) 在自动化中,Selenium 自动化测试中有一个名字经常被提及 PageObject (思想与面向对象的特征相同),通常PO 模型可 ...
- UI自动化测试框架:PO模式+数据驱动
1. PO 设计模式简介 2. 工程结构说明 3. 工程代码实现 page 包 action 包 business_process 包 util 包 conf 包 test_data 目录 log 目 ...
- web自动化测试中的PO模式(一)
1.PO模式的思想 原理: 将页面的元素定位和元素行为封装成一个page类 类的属性:元素的定位 类的行为:元素的操作 页面对象和测试用例分离 测试用例: 调用所需要页面对象中的行为,组成测试用例 测 ...
- UI自动化实战进阶PO设计模式
前言 经过前面的实战我们已经编写了几个测试用例,下面我们要用PO设计模式来调整我们的代码,让页面元素和测试业务进行分离,这样看起来直观而且后期的维护也方便. python有一个第三方的PO设计的库,既 ...
- UI自动化中无头浏览器的应用
因为某次工作中写了个脚本要来回跑,还要在本机上做很多其他的事情,所以就上网找了个方法,无头浏览器,这样就不会浏览器来回弹出来,执行用例还会很快. 废话不多说,直接放代码: #coding=utf-8 ...
- 关于UI自动化中元素定位常用方法的个人总结
1.如果目标元素有id属性,优先使用id定位: 2.元素locator尽可能保证简洁,考虑locator中路径的变化频率,尽量减少后期更新和维护成本: 3.使用xpath时,不要一味的使用‘/’逐层进 ...
- 小心!做 UI 自动化一定要跨过这些坑
一 .引子 UI自动化,在移动互联网时代的今天,一直都是在各大测试社区最为火爆的一个TOPIC.甚至在测试同行面前一提起自动化,大家就会自然而然的问:“恩,你们是用的什么框架?appium?还是rob ...
- UI自动化之三种等待
UI自动化中常用三种等待 目录 1.强制等待 2.隐式等待 3.显示等待 1.强制等待 执行到某一条语句后,然后sleep(3),等待3秒后,才会继续执行后面的语句 2.隐式等待 隐式等待只需要声明一 ...
- selenium(12)-web UI自动化项目实战(PO模式,代码封装)
web UI自动化项目实战-项目 项目使用禅道,所以你需要搭建1个禅道,搭建禅道的方法和步骤见 https://www.cnblogs.com/xinhua19/p/13151296.html 搭建U ...
随机推荐
- 利用Monkey进行APP测试
APP测试策略 功能测试 安装.卸载测试 升级测试(跨版本) 数据丢失 版本兼容 业务逻辑测试 UI测试 异常测试 适配测试 软件 兼容性测试 硬件 性能测试 效率测试 启动时间 响应时间 页面流畅度 ...
- 从MVC到DDD的架构演进
DDD这几年越来越火,资料也很多,大部分的资料都偏向于理论介绍,有给出的代码与传统MVC的三层架构差异较大,再加上大量的新概念很容易让初学者望而却步.本文从MVC架构角度来讲解如何演进到DDD架构. ...
- 基于TI DSP TMS320C6678、Xilinx K7 FPGA XC7K325T的高速数据处理核心板
一.板卡概述 该DSP+FPGA高速信号采集处理板由我公司自主研发,包含一片TI DSP TMS320C6678和一片Xilinx FPGA K7 XC72K325T-1ffg900.包含1个千兆网口 ...
- 基于TI DSP TMS320C6455、Xilinx V5 FPGA XC5VSX95T的高速数据处理核心板
一.板卡概述 该DSP+FPGA高速信号采集处理板由我公司自主研发,包含一片TI DSP TMS320C6455和一片Xilinx V5 FPGA XC5VSX95T-1FF1136i.包含1个千兆网 ...
- Memory Management in Rust
程序在运行时需要请求操作系统分配内存以及释放内存,因此,程序员在编写程序时,需要显式(手动)地编写分配和释放内存的代码,或者隐式(自动,由语言保证)地进行内存管理.对于前者,C/C++ 是代表语言,程 ...
- mysql linux 导出数据
1.mysql -hxx -uxx -pxx -e 'select "" name from a' db数据库 > file 2.导出的文件notepad++打开 3.新建e ...
- 内网渗透中mimikatz的使用
0x01 简介 mimikatz,很多人称之为密码抓取神器,但在内网渗透中,远不止这么简单 0x02 测试环境 网络资源管理模式: 域 已有资源: 域内一台主机权限 操作系统:win7 x64 域权限 ...
- RFC2889广播时延测试——网络测试仪实操
一.简介 RFC 2889为LAN交换设备的基准测试提供了方法学,它将RFC 2544中为网络互联设备基准测试所定义的方法学扩展到了交换设备,提供了交换机转发性能(Forwarding Perform ...
- 【C# .Net GC】后台垃圾回收
在后台垃圾回收 (GC) 中,在进行第 2 代回收的过程中,将会根据需要收集暂时代(第 0 代和第 1 代). 后台垃圾回收是在一个或多个专用线程上执行的,具体取决于它是后台还是服务器 GC,它只适用 ...
- 【C#基础概念】常量
常量的定义 常量是在编译时设置其值并且永远不能更改其值的字段. 使用常量可以为特殊值提供有意义的名称,而不是数字文本 常量是不可变的值,在编译时是已知的,在程序的生命周期内不会改变. 常量使用 con ...