页面对象(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)模式的更多相关文章

  1. selenium page object模式

    页面对象模式将测试代码和被测试页面的元素及操作进行分离,以降低页面元素的变化对测试代码的影响.每个被测试的页面都会被定义一个类,类中会定位元素和操作. 如果不使用page object模式,则相同的操 ...

  2. 转 Page Object模式

    Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通 ...

  3. UI自动化测试的Page Object模式

    在UI级的自动化测试框架中,当页面样式改变或者页面元素属性改变,那么代码也要随之进行修改,如何做到高效快速的修改代码来适应这些改变呢,这个时候可以引入Page Object模式,也是页面对象设计模式. ...

  4. 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式

    一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...

  5. selenium 的页面对象模型Page Object

    页面对象模型page object model是selenium中的一种脚本设计模式,它能将页面元素封装起来,与业务操作分隔开, 在页面变化改变时,无需去修改业务逻辑代码,提高脚本维护的效率. 1.p ...

  6. 浅析selenium的page object模式

    selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好 ...

  7. python+selenium自动化软件测试(第7章):Page Object模式

    什么是Page ObjectModel模式Page Objects是selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性不难理解,就是这个页 ...

  8. 使用page object模式抓取几个主要城市的pm2.5并从小到大排序后写入txt文档

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  9. Page Object 模式编写UiAutomator脚本

    在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM). 为什么要POM 用UiAutomator启动UI自动化测试不是一件困难的任务.你 ...

  10. Selenium3+python自动化014-自动化常用设计模式页面对象模型 (Page Object)

    一.概 念: PO(Page Object)设计模式是一种面向对象(页面对象)的设计模式,将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理. 二.优点可以使代码复用,降低维 ...

随机推荐

  1. tortoisegit错误: disconnected - no supported authentication methods available(server sent: publickey)

    修改小乌龟的 SSH客户端:

  2. Spring MVC 框架结构介绍(二)

    Spring MVC框架结构 Spring MVC是围绕DispatcherServlet设计的,DispatcherServlet向处理程序分发各种请求.处理程序默认基于@Controller和@R ...

  3. Java 语言基础之数组(一)

    数组定义及格式: 数组: 同一种类型数据的集合, 就是一个容器 定义数组格式1: 元素类型[] 数组名 = new 元素类型[元素个数(即数组长度)]; 说明: 数组是一个容器.而容器属于一个实体,实 ...

  4. windows下安装Composer提示缺少openssl的解决方法

    在Windows环境下安装Composer(注:Composer要求PHP版本在5.3.2+),你可能会遇到这种安装失败的情况:出错信息是 "The openssl extension is ...

  5. Django - 权限(4)- queryset、二级菜单的默认显示、动态显示按钮权限

    一.queryset Queryset是django中构建的一种数据结构,ORM查询集往往是queryset数据类型,我们来进一步了解一下queryset的特点. 1.可切片 使用Python 的切片 ...

  6. sql server内存使用情况

    查看Sql Server 数据库的内存使用情况 转自:https://www.cnblogs.com/wanghao4023030/p/8299478.html    DBCC MemoryStatu ...

  7. jquery关于select框的取值和赋值

    jQuery("#select_id").change(function(){}); // 1.为Select添加事件,当选择其中一项时触发      var checkValue ...

  8. java多线程总结(二)

    线程一般有6个状态: 新建状态:NEW 可运行状态:RUNNABLE 休眠状态:TIMED_WAITING 等待状态:WAITING 阻塞状态:BLOCKED 终止状态“TERMINATED 当我们使 ...

  9. wtforms Form实例化流程(源码解析)

      class LoginForm(Form): #首先执行后得到的结果是UnboundField()对象 name=simple.StringField( label='用户名', validato ...

  10. PAT 天梯赛 L1-008. 求整数段和 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-008 AC代码 #include <iostream> #include <cstdio&g ...