初识Page Object
PageObject是UI自动化测试项目开发实践的最佳设计模式之一,它的主要特点体现在对界面交互细节的封装上,使测试用例更加专注于业务的操作,从而提高测试用例的可维护性。
1.认识Page Object
Page Object设计模式的优点:
- 减少代码的重复
- 提高测试用例的可读性
- 提高测试用例的可维护性,特别是针对UI频繁变化的项目;
Page Object应遵循以下原则进行开发:
- Page Object应该易于使用
- 有清晰的结构,如PageObject对应页面对象,PageModules对应页面内容
- 只写测试内容,不写基础内容
- 在可能的情况下放置样板代码
- 不需要自己管理浏览器
- 在运行时选择浏览器,而不是类级别
- 不需要直接接触Selenium
Page Object简单实例:
已百度搜索为例,假设我们有如下测试代码:
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By class Test(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.base_url = 'http://www.baidu.com' def test_baidu_search_case1(self):
self.driver.get(self.base_url)
self.driver.find_element(By.ID, 'kw').send_keys('unittest')
self.driver.find_element(By.ID, 'su').click() def test_baidu_search_case2(self):
self.driver.get(self.base_url)
self.driver.find_element(By.ID, 'kw').send_keys('selenium')
self.driver.find_element(By.ID, 'su').click() def test_baidu_search_case3(self):
self.driver.get(self.base_url)
self.driver.find_element(By.ID, 'kw').send_keys('page object')
self.driver.find_element(By.ID, 'su').click() def tearDown(self):
self.driver.quit() if __name__ == '__main__':
unittest.main()
这段代码最大的问题就是三条测试用例中重复使用了元素的定位和操作。这会带来一个很大的问题,当元素的定位发生变化后,例如id=kw失效了,应及时调整整个定位方法,这时就需要三条测试用例分别进行更改。假设,我们的自动化不止3条测试用例,而UI不断变化,那么就会提高自动化测试用例的维护成本。
Page Object的设计思想上是把元素定位于元素操作进行分层,这样带来的最直接的好处就是当元素发生变化时,只需要维护page层的元素定位,而不需要关心在哪些测试用例当中使用了这些元素。在编写测试用例时,也不需要关心元素是如何定位的。
上面代码进行优化:
from selenium.webdriver.common.by import By class BaiduPage:
def __init__(self, driver):
self.driver = driver def search_input(self, search_key):
self.driver.find_element(By.ID, 'kw').send_keys(search_key) def search_button(self):
self.driver.find_element(By.ID, 'su').click()
首先,创建了一个BaiduPage类,在__init__()初始化方法中接受参数driver并赋值给self.driver。然后分别封装了search_input()和search_button()方法,定位并元素操作。这里的封装只针对一个页面中可能会操作到的元素,原则上是一个元素封装成一个方法。当元素的定位方法发生改变时,只需要维护这里的方法即可。而不需要关心这个方法被那谢谢测试用例使用了。
使用:
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from samples.baidu_page import BaiduPage class Test(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.base_url = 'http://www.baidu.com' def test_baidu_search_case1(self):
self.driver.get(self.base_url)
bd = BaiduPage(self.driver)
bd.search_input('selenium')
bd.search_button() def test_baidu_search_case2(self):
self.driver.get(self.base_url)
bd = BaiduPage(self.driver)
bd.search_input('unittest')
bd.search_button() def test_baidu_search_case3(self):
self.driver.get(self.base_url)
bd = BaiduPage(self.driver)
bd.search_input('page object')
bd.search_button() def tearDown(self):
self.driver.quit() if __name__ == '__main__':
unittest.main()
首先在测试中导入BaiduPage类,然后在每个测试用例中为BaiduPage类传入 驱动,这样就可以轻松地使用它封装的方法来设计具体的测试用例了。这样做的目的就是在测试用例中消除元素定位。如果你要操作百度输入框,那么只需要调用search_input()方法并传入搜索关键字即可,并不需要再重新编写定位元素。
备注:这样的方法带来了许多好处,但是也带来了一些问题。例如,需要些更多的代码。以前一条测试用例只需要写4到5行代码即可,现在却不得不现在Page层次对每个带操作的元素进行封装,然后在到具体的测试用例的引用。
备注:学习selenium3 自动化测试实战
初识Page Object的更多相关文章
- Selenium的PO模式(Page Object Model)[python版]
Page Object Model 简称POM 普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...
- 使用page object模式抓取几个主要城市的pm2.5并从小到大排序后写入txt文档
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...
- Page Object Model (Selenium, Python)
时间 2015-06-15 00:11:56 Qxf2 blog 原文 http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...
- 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式
一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...
- 浅析selenium的page object模式
selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好 ...
- Page Object 模式编写UiAutomator脚本
在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM). 为什么要POM 用UiAutomator启动UI自动化测试不是一件困难的任务.你 ...
- selenium page object model
Page Object Model (POM) & Page Factory in Selenium: Ultimate Guide 来源:http://www.guru99.com/page ...
- 为什么需要Page Object?
为什么需要Page Object? Page Object(PO)是界面自动化验收测试中的一个常见模式,要和@槽神刘叫兽探讨一下PO的必要性,顾写这篇小文表达一下我的观点. PO的主要价值体现在对界面 ...
随机推荐
- 漫谈LiteOS-端云互通组件-MQTT开发指南(下)
1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...
- REDHAT7进入单用户模式
Redhat7采用的是grub2,和Redhat6.x进入单用户的方法不同. 一.init方法 1.centos7的grub2界面会有两个入口,正常系统入口和救援模式: 2.修改grub2引导 在正常 ...
- 基于口令的密码(PBE)
基于口令的密码(PBE) 基于口令的密码(Password Based Encryption,PBE)是一种基于口令生成密钥,并使用该密钥进行加密的方法.其中加密和解密使用的是同一个密钥. 根据用户自 ...
- iOS架构入门 - MVC模式实例演示
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外,此模式通过对复杂度的简化,使程序结构更加直观 控制器(Controller)-- ...
- 解决 Retrofit 多 BaseUrl 及运行时动态改变 BaseUrl ?
原文地址: juejin.im/post/597856- 解决Retrofit多BaseUrl及运行时动态改变BaseUrl(一) 解决Retrofit多BaseUrl及运行时动态改变BaseUrl( ...
- Ceph 12.2.0 实践osd 智能分组功能
以前我们需要对ssd和hdd进行分组的时候,需要大量的修改crush map,然后绑定不同的存储池到不同的 crush 树上面,现在这个逻辑简化了很多.以上是官方宣传听起来很不错等到12.2.0稳定版 ...
- Golang Context 的原理与实战
本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现. golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Gola ...
- 曹工谈并发:Synchronized升级为重量级锁后,靠什么 API 来阻塞自己
背景 因为想知道java中的关键字,对应的操作系统级别的api是啥,本来打算整理几个我知道的出来,但是,尴尬的是,我发现java里最重要的synchronized关键字,我就不知道它对应的api是什么 ...
- java socket实现服务端,客户端简单网络通信。Chat
之前写的实现简单网络通信的代码,有一些严重bug.后面详细写. 根据上次的代码,主要增加了用户注册,登录页面,以及实现了实时显示当前在登录状态的人数.并解决一些上次未发现的bug.(主要功能代码参见之 ...
- python-os.rmdir与shutil.rmtree的区别和用法
每次写脚本的时候,pycharm都会自动生成缓存文件__pycache__文件,在提交代码的时候还得挨个删除,于是自己写一小段代码自动循环删除此目录及下面的文件. 思路: 先将目录及其下的文件读取出来 ...