PO模式在selenium自动化测试框架的优势

PO模式简介

1.什么是PO模式

PO模型是:Page Object Model的简写 页面对象模型

作用:就是把测试页面和测试脚本进行分离,即把页面封装成类,供测试脚本进行调用;

分层机制,让不同层去做不同类型的事情,让代码结构清晰,增加复用性。

PO设计模式是Selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装

2. 不使用PO设计会出现以下几种情况:

复用性不太好,扩展性不好,易读性差,不好维护,UI界面频繁的项目维护起来比较麻烦。

3.PO模式的优缺点

优点:

  • 提高代码的可读性
  • 减少了代码的重复
  • 提高代码的可维护性,特别是针对UI界面频繁的项目

缺点:

  • 造成项目结构比较复杂,因为是根据流程进行了模块化处理

下面重点看下PO模式在selenium自动化测试框架的优势。

PO模式是在UI自动化测试过程当中使用非常频繁的一种设计模式,使用这种模式后,可以有效的提升代码的复用能力,并且让自动化测试代码维护起来更加方便。

PO模式的全称叫page object model(POM),有时候叫做 page object pattern。最开始由马丁福勒提出,这个模式受到selenium自动化测试框架大力推广,因而成为一种非常主流的自动化测试设计模式。

在PO模式当中,每一个UI页面使用编程语言当中的类来表示。在这个类当中,通过函数形式定义页面的行为和操作。这让调用方不需要关注具体执行的操作到底是点击还是拖动,而是关注具体的业务,比如登录、购物等等,甚至如果程序员直接把代码给产品经理看,他也是能看懂的。

没有使用PO模式时

在测试用例中直接编写浏览器操作API,对于代码编写者并没有多高的难度,因为他自己已经对这些API非常熟悉,但是这些浏览器操作并不能体现业务,至少没有产品经理那么熟悉,因此他很难和产品经理进行沟通,也难和开发沟通,甚至在半个月之后,他已经忘记了自己到底写了什么东西。

def test_login_mail(self):
    driver = self.driver
    driver.get("http://www.xxx.xxx.com")
    driver.find_element_by_id("idInput").clear()
    driver.find_element_by_id("xxxxxxx").send_keys("xxxxx")
    driver.find_element_by_id("xxxxxxx").clear()
    driver.find_element_by_id("xxxxxxx").send_keys("xxxxxx")
    driver.find_element_by_id("loginBtn").click()

使用PO模式

使用PO模式有利于梳理业务,也有利于和其他人进行沟通。当你把下面这段代码拿给产品经理看的时候,他也大概能知道你测的是什么业务,能帮你纠正你的测试流程是否正确,或者提出一些更有建设性的意见,这对于大型项目需要频繁沟通和梳理业务时非常有用。

def test_login_mail(self):
    LoginPage(driver).login()

而浏览器本身的操作,就会被分离到一个更底层的模块,这些代码你可以不对调用方暴露,产品经理并不关心你这个页面中什么元素定位,他也不懂。

class LoginPage:
	username_loc=(By.ID,"idInput")
    password_loc =(By.ID,"pwdInput")
    submit_loc =(By.ID,"loginBtn")
    span_loc=(By.CSS_SELECTOR,"div.error-tt>p")
    dynpw_loc =(By.ID,"lbDynPw")
    userid_loc =(By.ID,"spnUid")
    def __init__(self, driver):
        self.driver = driver
    def login(self):
        self.driver.find_element(*self.username_loc).clear()
        self.driver.find_element(*self.username_loc).send_keys("xxxxx")
        self.driver.find_element(*self.password_loc).clear()
        self.driver.find_element(*self.password_loc).send_keys("xxxxxx")
        self.driver.find_element(*self.submit_loc).click()

这种方式把元素定位方式也分离了。但是这种元素定位的表达式可读性也不是很强,可以换用 property 方式来表示元素,所有的元素统一放在一起,修改起来也比较方便。

class LoginPage:
    def __init__(self, driver)
    	self.driver = driver
    @property
    def username_element(self):
        return self.driver.find_element('id', 'idInput')
    def password_element(self):
        return self.driver.find_element('id', 'pwdInput')
    def submit_element(self):
        return self.driver.find_element('id', 'loginBtn')
    def login(self, name, password):
        self.username_element.send_keys(name)
        self.password_element.send_keys(password)
        self.submit_element.click()

第三种方式可以充分利用Python的描述符特性,你会发现很多序列化库或者ORM框架都有类似的用法。

class LoginPage:
    def __init__(self, driver)
    	self.driver = driver
    username = Element(css='#idInput', desc='用户名输入框')
    password = Element(css='#pwdInput', desc='密码输入框')
    confirm = Element(css='#loginBtn', desc='登录确认按钮')
   	def login(self, name, password):
        self.username.send_keys(name)
        self.password.send_keys(password)
        self.confirm.click()

而 Element 类可以通过 Python 描述符实现,这里为了方便,只定义了xpath的元素定位方法:

class Element:
    def __init__(self,xpath=None,desc=''):
        self.xpath = xpath
        self.desc = desc
    def __get__(self, instance, owner):
        driver = instance.browser
        el = driver.find_element('xpath', self.xpath)
        return el

PO模式和DDD

PO模式是DDD(领域驱动设计)的一个简单实现,但是还不够彻底。如果要在自动化测试中贯彻DDD,我觉得还有一些可以优化的空间。

首先某一个业务不一定只是单个页面的操作,比如登录不一定只涉及到LoginPage这个页面,因此直接在LoginPage中编写login函数就不是很合理。对于调用方来说,应该明确说明的是谁在登录,而不是指某个页面。像这样:

user.login()
# or
login(user)

我们编写的代码就像是自然语言,任何懂英语的人都知道代码在做什么,在DDD中,叫做领域特定语言(DSL), 要实现这种逻辑,在Page类和调用中间应该还会有一个层级来封装user。

其次,Page页面会依赖更底层的资源,比如组件,元素类型。因此在 Page 类的下方应该会使用 InputElement, ButtonElement 、SelectElement 这样的元素类和 HeaderComponent、FooterComponent 这样的组件类。

class LoginPage:
	username_filed = InputElement('xxx')
	password_filed = PasswordElement('xxx')

领域驱动设计对于大型项目梳理业务、同步业务、沟通业务是非常有帮助的,是一种以业务为中心的设计范式。PO模式对于DDD的小范围应用,以及具体了足够多的好处:

  • 便于维护。每一个页面的操作都被单独的存放在一个类文件中,当前端页面被修改之后,只需要找到对应类文件进行修改,其他的代码并不需要进行修改,这符合单一职责原则。
  • 便于重复使用。在进行自动化测试的时候,一个测试由多个测试步骤组成,这些测试步骤可能涉及到多个页面的操作。而用例与用例之间的操作可能重合。PO模式可以重复利用这些测试步骤,简化代码的编写。
  • 提高了可读性。页面的操作都被以函数的形式封装起来了。函数名就具备注释的作用,其他人阅读代码时可以通过函数了解业务。

到此这篇关于PO模式在selenium自动化测试框架有什么好处的文章就介绍到这了,更多相关selenium自动化测试内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python自动化测试selenium屏幕截图示例

    WebDriver内置了测试中捕获屏幕并保存的方法. 示例脚本: (1)save_screenshot(filename):保存屏幕截图 from selenium import webdriver from time import sleep,strftime,localtime,time import os class TestScreenShot(object): def setup(self): self.driver = webdriver.Chrome() self.driver.g

  • python自动化测试selenium定位frame及iframe示例

    frame标签有frameset.frame.iframe三种,frameset和其它普通标签没有区别,不会影响正常定位,而frame与iframe对selenium定位而言是一样的. Selenium有以下方法对frame进行操作. 示例网站:http://sahitest.com/demo/framesTest.htm 示例脚本: from selenium import webdriver from time import sleep class TestFrame(object): de

  • selenium自动化测试简单准备

    目录 下载驱动器 chrome版本查看 基本函数 练习一(简单网页注册) 练习二 练习三 下载驱动器 http://chromedriver.storage.googleapis.com/index.html 下载与谷歌版本相同或最近版本. chrome版本查看 帮助中查看 导包 from selenium import webdriver 创建浏览器对象(以chrome为例) driverpath = r' '# 驱动器路径(chromedriver.exe) driver = webdriv

  • po+selenium+unittest自动化测试项目实战

    目录 一.项目工程目录: 二.具体工程文件代码: 一.项目工程目录: 二.具体工程文件代码: 1.新建一个包名:common(用于存放基本函数封装) (1)在common包下新建一个base.py文件,作用:页面操作封装.base.py文件代码如下: # coding=utf-8 """ ------------------------------------ @Time : 2020/01/15 @Auth : Anker @File : base.py @Descript

  • Python + selenium 自动化测试框架详解

    目录 自动化测试框架 1.基础层(通用层) 2.功能层(页面层) 3.业务层 4.用例层 4层框架对应的项目工程 总结 自动化测试框架 项目自动化测试框架设计为4层 1.基础层(通用层) 基础层: 将通用,重复性比较高的代码封装到这里. 写通用的代码的. 其他3层想要的话,就可以直接调用. 例如: 读取测试数据的代码,读取配置信息的代码:截图的代码的,定位元素的代码等等 2.功能层(页面层) 功能层: pages 封装页面的. 把页面封装成类.类中包含:属性和方法 把页面上的界面元素定义成类的属

  • python自动化测试selenium执行js脚本实现示例

    WebDriver有2个方法执行Java Script脚本. (1)同步执行:execute_script (2)异步执行:execute_async_script from selenium import webdriver from time import sleep class TestScriptss(object): def setup(self): self.driver = webdriver.Chrome() self.driver.get(http://www.baidu.co

  • PO模式在selenium自动化测试框架的优势

    PO模式简介 1.什么是PO模式 PO模型是:Page Object Model的简写 页面对象模型 作用:就是把测试页面和测试脚本进行分离,即把页面封装成类,供测试脚本进行调用; 分层机制,让不同层去做不同类型的事情,让代码结构清晰,增加复用性. PO设计模式是Selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装 2. 不使用PO设计会出现以下几种情况: 复用性不太好,扩展性不好,易读性差,不好维护,UI界面频繁的项目维护起来比较麻烦. 3.PO模式的优缺点 优点:

  • python selenium自动化测试框架搭建的方法步骤

    设计思路 本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享. 框架采用python3 + selenium3 + PO + yaml + ddt + unittest等技术编写成基础测试框架,能适应日常测试工作需要. 1.使用Page Object模式将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),一个页面建一个对象类,提高用例的可维护性: 2.使用yaml管理页面控件元素数据和测试用例数据.例如元素ID等发生变化时,不需要去修改测试代码,只需要在对应的

  • 分享我的第一次java Selenium自动化测试框架开发过程

    由于公司的开发团队偏向于使用Java技术,而且公司倡导学习开源技术,所以我选择用Java语言来进行Selenium WebDriver的自动化框架开发.由于本人没有Java开发经验,以前虽然学过QTP但从没有接触过Selenium,正好通过这个机会能学习一下自动化测试,同时也学习一下基本的Java开发过程. 一.首先是搭建框架开发环境 按照网上的方法部署eclipse,建立TestAction工程,并Import引用JDK和Selenium-2.44完整包 二.继续引用和安装相关jar包 1.首

  • python3+selenium自动化测试框架详解

    背景 为了更好的发展自身的测试技能,应对测试行业以及互联网行业的迭代变化.自学python以及自动化测试. 虽然在2017年已经开始接触了selenium,期间是断断续续执行自动化测试,因为还有其他测试任务,培训任务要执行- 前期建议大家能够学习python基本语法(python基础教程) 任务 搭建自动化测试框架,并能有效方便的进行测试,维护成本也要考虑其中. 过程 我的自动化框架可能不成熟,因为是自学的.请多包涵.也请大佬指导~ common 包含:基本的公共方法类,比如HTML报告.Log

  • python中的selenium安装的步骤(浏览器自动化测试框架)

    一.前言 我们今天要安装的selenium 就是浏览器自动化测试框架,是一个用于Web应用程序的测试工具,就是模拟用户操作.支持的浏览器包括Chrome,IE,Mozilla Firefox,Safari,Opera等.今天我们以Chrome为例讲一下安装方法. (其他方法大同小异) 二.准备工作 2.1.下载浏览器驱动并安装 一般的包安装直接在cmd <pip install 包的名称>,但这个包还需要下载相应的浏览器的驱动,这里强烈推荐Chrome,谁用谁知道.(没有学python爬虫之前

  • 一文详解Python中PO模式的设计与实现

    目录 什么是PO模式 PO 三层模式 PO 设计模式的优点 将改写的脚本转为PO设计模式 构建基础的 BasePage 层 构建首页的 Page 层(HomePage) 构建登录页的 Page 层(LoginPage) 构建 首页 - 订单 - 支付 流程的 Page 层(OrderPage) PO 设计模式下测试Case的改造 在使用 Python 进行编码的时候,会使用自身自带的编码设计格式,比如说最常见的单例模式,稍微抽象一些的抽象工厂模式等等… 在利用 Python 做自动化测试的时候,

  • Pytest接口自动化测试框架搭建模板

    auto_api_test 开发环境: Pycharm 开发语言&版本: python3.7.8 测试框架: Pytest.测试报告: Allure 项目源码Git地址 项目目录结构 api – 模仿PO模式, 抽象出页面类, 页面类内包含页面所包含所有接口, 并封装成方法可供其他模块直接调用 config – 配置文件目录 data – 测试数据目录 doc – 文档存放目录 log – 日志 report – 测试报告 scripts – 测试脚本存放目录 tools – 工具类目录 .gi

  • Python自动化测试框架之unittest使用详解

    目录 1 unittest框架 2 批量执行脚本 2.1 构建测试套件 2.2 用例的执行顺序 2.3 忽略用例执行 3 unittest断言 4 HTML报告生成 5 异常捕捉与错误截图 6 数据驱动 1 unittest框架 unittest 是python 的单元测试框架,它主要有以下作用: 提供用例组织与执行:当你的测试用例只有几条时,可以不必考虑用例的组织,但是,当测试用例达到成百上千条时,大量的测试用例堆砌在一起,就产生了扩展性与维护性等问题,此时需要考虑用例的规范与组织问题了.单元

  • Python3+RIDE+RobotFramework自动化测试框架搭建过程详解

    Python2.7已于2020年1月1日开始停用,之前RF做自动化都是基于Python2的版本. 没办法,跟随时代的脚步,我们也不得不升级以应用新的控件与功能. 升级麻烦,直接全新安装. 一.Python安装 最新版Python下载地址:https://www.python.org/ 根据操作系统选择对应版本制品下载安装即可,本机用的是Windows x86-64 executable installer. 注意事项: 安装完成后检查下环境变量,默认会配置好,可以检查下. 检测是否安装成功,可在

随机推荐