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的更多相关文章

  1. Selenium的PO模式(Page Object Model)[python版]

     Page Object Model 简称POM  普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...

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

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

  3. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  4. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

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

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

  6. 浅析selenium的page object模式

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

  7. Page Object 模式编写UiAutomator脚本

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

  8. selenium page object model

    Page Object Model (POM) & Page Factory in Selenium: Ultimate Guide 来源:http://www.guru99.com/page ...

  9. 为什么需要Page Object?

    为什么需要Page Object? Page Object(PO)是界面自动化验收测试中的一个常见模式,要和@槽神刘叫兽探讨一下PO的必要性,顾写这篇小文表达一下我的观点. PO的主要价值体现在对界面 ...

随机推荐

  1. radio样式

    .radio{ position: relative; border: 1px solid #999; border-radius: 50%; width: 12px; height: 12px; b ...

  2. 天池Docker学习赛笔记

    容器的基本概念 什么是容器? 容器就是一个视图隔离.资源可限制.独立文件系统的进程集合.所谓"视图隔离"就是能够看到部分进程以及具有独立的主机名等:控制资源使用率则是可以对于内存大 ...

  3. C#多线程(12):线程池

    目录 线程池 ThreadPool 常用属性和方法 线程池说明和示例 线程池线程数 线程池线程数说明 不支持的线程池异步委托 任务取消功能 计时器 线程池 线程池全称为托管线程池,线程池受 .NET ...

  4. react引入图片不显示问题

    在react 中引入图片的方式和正常不同,,很容易引入不显示 引入本地图片 1.(采用组件式引入方法) import Logo from "图片路径" <img src={L ...

  5. SpringBoot @ConfigurationProperties详解

    文章目录 简介 添加依赖关系 一个简单的例子 属性嵌套 @ConfigurationProperties和@Bean 属性验证 属性转换 自定义Converter SpringBoot @Config ...

  6. shell脚本(多线程批量创建用户)

    shell脚本中的多线程 很多场景中会用到多线程,例如备份数据库,有100个库,正常备份效率极其低下.有了多线程原本可能需要10个小时备份,现在分10个线程同时去干,只要一个小时就解决了.今天就介绍下 ...

  7. MyBatis学习总结(9)——使用MyBatis Generator自动创建代码

    2019独角兽企业重金招聘Python工程师标准>>> 由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所 ...

  8. Java Web:jstl处理字符串

    用法:${fn:methodName(args....)} 在使用这些函数之前必须在JSP中引入标准函数的声明<%@ taglib prefix="fn" uri=" ...

  9. POJ 1287 Networking 垃圾题目

    Networking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22362   Accepted: 11372 Desc ...

  10. P4168 蒲公英

    神仙分块,把减写成加调了半小时.. 不过这题也启示我们其实有的分块题要把多个块的信息拿到一起维护 以前做的都是每个块的信息单独维护 写的分块题还不太多,同时维护一个块的左右边界好像有点冗余,不过这样代 ...