5.8 页面对象(Page Object)模式
页面对象(Page Object)模式是目前自动化测试领域普遍使用的设计模式之一,此模式可以大大提高测试代码的复用率,提高测试脚本的编写效率和维护效率,是中级自动化测试工程师的必备技能之一。
1.页面对象模式简介
自动化测试脚本除了在一定程度上难编写,还有一个巨大的挑战,就是如何尽量减少维护的成本。大量的脚本因为难以维护,导致测试人员不得不再次投入大量资源去重新编写新的测试脚本,以满足日新月异的需求调整和变化。自动化测试脚本的巨大维护成本不仅会造成大量的人力投入,还会导致测试需求无法被快速响应,长此以往,会严重阻碍自动化测试在项目中的深入实施。
为了尽量解决上面的窘境,自动化测试脚本需要使用一些设计模式来降低测试脚本的工作量,提高自动化测试的投入产出比,延长自动化测试脚本的服务和工作周期。WebDriver提供了页面对象模式来提高自动化测试脚本的可维护性,此模式已经广泛应用于自动化测试领域。
使用面向对象的设计模式,页面对象模型将测试代码和被测试页面的页面元素及其操作方法进行分离,以此降低页面元素变化对测试代码的影响。每一个被测试页面都会被单独定义为一个类,类中会定位所有需进行测试操作的页面元素对象,并且定义操作每一个页面元素对象的方法。
例如,登录页面包括一个用户输入框和一个密码输入框,还有一个登录按钮。
我们声明一个名为Login的类,并且通过定位表达式找到用户名和密码输入框,并赋予类中的成员变量,分别定义输入用户名的方法、输入密码的方法和单击登录按钮的方法。
测试代码要完成登录测试,只需要调用Login类中输入用户名的方法、输入密码的方法和单击登录按钮的方法即可完成一个登录操作。如果登录页面的用户输入框、密码输入框或者登录按钮发生了位置变化,我们只需要修改Login类中的相关定位表达式和操作方法就可以完成维护,测试逻辑的脚本甚至不需要改变。
如果用户没有使用此模式,那么将登录过程都用相同的代码进行实现。如果在测试过程中需要多次登录操作,那么只能粘贴相同的代码来简化编写工作。但是可怕的情况是一旦页面元素发生了一点点改变,那么测试人员需要人工去把所有涉及变化的逻辑一一修改,会在不同的测试代码中进行搜索和修改,这样不但大大增加了工作量,而且很容易出现修改错误的情况。使用了页面对象模式,只需要修改一下唯一的Login类,就完成了大部分的维护工作。
2.使用PageFactory类
(1)使用PageFactory类给测试类提供待操作的页面元素
首先在src中新建一个package,名字为pageobjects,在下面新建一个页面对象类LoginPage。新建一个package,名字为testScripts,在下面新建一个测试类Test126mail。
LoginPage类的源代码如下:
Test126mail类的源代码如下:
从上面的实例中我们可以看到,页面元素的定位均在LoginPage类中实现了。如果页面元素发生了一定程度的调整,测试人员只需要修改LoginPage类中的定位表达式就可以完成基本的维护工作,测试类代码无需进行调整,从而降低了测试代码的维护工作。
(2)使用PageFactory类封装页面元素的操作方法
上面我们只为测试类提供了页面元素来进行操作,并没有在页面对象类中实现页面元素的操作方法。
LoginPage类的源代码如下:
Test126mail的源代码如下:
在页面对象中封装了页面元素的操作方法,使得在测试代码中实现测试逻辑更加容易。这些封装方法可以被很多测试逻辑重复调用,从而提高了代码编写和维护的效率,实现了一个类维护,很多测试类可被调用的目的,进一步降低了测试代码的维护成本。
(3)使用LoadableComponent类
继承LoadableComponent类可以在页面加载的时候判断是否加载了正确的页面,只需要重写isLoaded和load两个方法。此方式有助于让页面对象的页面访问操作更加健壮。
LoginPage类的源代码:
Test126mail类的源代码:
(4)多个PageObject的自动化测试实例
本节主要讲解多个PageObject的使用方法,以及如何基于多个PageObject实现一个相对复杂的自动化测试实例。
自动化测试实现的3个测试用例如下:
a.在126邮箱,使用正确的用户名和错误的密码进行登录,登录失败并在页面显示“帐号或密码错误”关键字。
b.在126邮箱,使用正确的用户名和正确的密码进行登录,登录成功后会跳转到邮箱文件夹列表首页,并且显示出“收件箱”关键字。
c.在126邮箱,登录成功后,单击“写信”链接,给testYY2017@126.com发送一封邮件,邮件发送成功后页面显示“发送成功”关键字。
LoginPage类:
HomePage类:
SendSuccessPage类:
Test126mail类
3.设计原则
(1)在PageObject类中定义public方法来对外提供服务。
(2)不要暴露PageObject类中的内部逻辑。
(3)不要在PageObject类中进行断言操作。
(4)只需要在PageObject类中定义需要操作的元素和操作方法。
(5)PageObject页面中的相同动作如果会产生多个不同的结果,需要在PageObject类中定义多个操作方法。
5.8 页面对象(Page Object)模式的更多相关文章
- selenium page object模式
页面对象模式将测试代码和被测试页面的元素及操作进行分离,以降低页面元素的变化对测试代码的影响.每个被测试的页面都会被定义一个类,类中会定位元素和操作. 如果不使用page object模式,则相同的操 ...
- 转 Page Object模式
Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通 ...
- UI自动化测试的Page Object模式
在UI级的自动化测试框架中,当页面样式改变或者页面元素属性改变,那么代码也要随之进行修改,如何做到高效快速的修改代码来适应这些改变呢,这个时候可以引入Page Object模式,也是页面对象设计模式. ...
- 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式
一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...
- selenium 的页面对象模型Page Object
页面对象模型page object model是selenium中的一种脚本设计模式,它能将页面元素封装起来,与业务操作分隔开, 在页面变化改变时,无需去修改业务逻辑代码,提高脚本维护的效率. 1.p ...
- 浅析selenium的page object模式
selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好 ...
- python+selenium自动化软件测试(第7章):Page Object模式
什么是Page ObjectModel模式Page Objects是selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性不难理解,就是这个页 ...
- 使用page object模式抓取几个主要城市的pm2.5并从小到大排序后写入txt文档
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- Page Object 模式编写UiAutomator脚本
在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM). 为什么要POM 用UiAutomator启动UI自动化测试不是一件困难的任务.你 ...
- Selenium3+python自动化014-自动化常用设计模式页面对象模型 (Page Object)
一.概 念: PO(Page Object)设计模式是一种面向对象(页面对象)的设计模式,将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理. 二.优点可以使代码复用,降低维 ...
随机推荐
- shell判断文件/目录是否存在
https://www.cnblogs.com/37yan/p/6962563.html caution!!! if should be end with fi caution!!! there sh ...
- OpenStack Network --- introduction部分 阅读笔记
Basic Networking 1.混杂模式(promiscuous mode):当网卡被配置为混杂模式时,它们会将所有的frame传递给操作系统,即使MAC地址不匹配. 2.交换机(switch) ...
- 利用VMware克隆linux虚拟机需要注意的事项
利用VMware克隆虚拟机需要注意的问题 2018年03月30日 18:20:29 温文尔雅的流氓 阅读数:1343更多 个人分类: linux 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
- Java-idea-生成JavaDoc
1.选中要生成的doc模块 2.选择Tools→Generate JavaDoc 3.填写一下信息 1. 选择是整个项目还是模块还是单个文件 2. 文档输出路径 4. 传入JavaDoc的参数,一般这 ...
- Linux主从同步监测和利用sendMail来发邮件
首先介绍下sendMail About SendEmailSendEmail is a lightweight, command line SMTP email client. If you have ...
- day1 python调用模块,密码加密
import getpass #加密密码 username = input("username:") password = getpass.getpass("passwo ...
- dojo 官方翻译 dojo/Deferred
延迟,异步调用 官网地址:http://dojotoolkit.org/reference-guide/1.9/dojo/Deferred.html require(["dojo/Defer ...
- linux centos7 安装zookeeper
linux 系统下 zookeeper 安装教程 1.下载安装包 1)进入安装目录 cd /home/install/ 2)下载 wget http://mirror.bit.edu.cn/apach ...
- 理解音视频 PTS 和 DTS
视频 视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,然后快速翻动的感觉. 但是在实际应用中,并不是每一帧都是完整的画面,因为如果每一帧画面都是完整 ...
- 【Head First Servlets and JSP】笔记
1.谈到服务器的时候,可能是指物理主机(硬件),也可能是指Web服务应用(软件). 2.谈到客户的时候,通常指人类用户,或者是浏览器应用,或者两者都包括,浏览器应用做些什么?发送请求.解释HTML和呈 ...