PO 模式:是 Page Object 的简称, 也可称为 Page Object Model, 简称为 POM PO 模式的思想就是 : 把一个页面转化成对象 为什么用 po 模式? po 模式的好处在哪里? – 可读性强, 通过方法名称表示页面操作 – 可扩展性, – 可维护性。前端发生变化和用例发生变化。 – 可复用性。重复代码共用。 不使用PO模式的缺点??? 1.易读性差:一连串的find element会使代码显得杂乱无章 2.可扩展性不好:用例孤立,无法扩展 3.可复用性差:无公共方法,很难复用 4.可维护性差:一旦元素变化,需要维护修改大量测试用例
能够使用方法封装的思想对代码进行优化 3. 深入理解PO模式的思想 4. 熟练掌握PO模式的分层思想 PO模式学习思路 采用版本迭代的方式来学习,便于对不同版本的优缺点进行对比和理解。 V1:不使用任何设计模式和单元测试框架 V2: 使 用 UnitTest 管 理 用 例 V3:使用方法封装的思想,对代码进行优化 V4:采用PO模式的分层思想对代码进行拆分V5 :对PO分层之后的代码继续优化 V6:PO模式深入封装,把共同操作提取封装到父类中,子类直接调用父类的方法 无模式 目标 1. 输入一个不存在的用户名 3. 输入密码 4. 输入验证码 5. 点击登录按钮 6. 获取错误提示信息密码错误 1. 点击首页的‘登录’链接,进入登录页面 2. 输入用户名 3. V1版本 不使用任何设计模式和单元测试框架。 每个文件里编写一个用例,完全的面向过程的编程方式。
深入理解PO模式的思想 2. 熟练掌握PO模式的分层思想 1. 存在的问题 在做UI自动化时定位元素特别依赖页面,一旦页面发生变更就不得不跟着去修改定位元素的代码。 PO模式 PO是Page Object的缩写,PO模式是自动化测试项目开发实践的最佳设计模式之一。 PO模式可以把一个页面分为三层,对象库层、操作层、业务层。 对象库层:封装定位元素的方法。操作层:封装对元素的操作。 业务层:将一个或多个操作组合起来完成一个业务功能。 2.1 引入PO模式的好处 引入PO模式前 存在大量冗余代码 业务流程不清晰后期维护成本大 引入PO模式后 减少冗余代码 业务代码和测试代码被分开,降低耦合性维护成本低 发布者:全栈程序员栈长,转载请注明出处
浅谈PO模式 概述 设计原则 优点 小例子 概述 PO模式是自动化测试的一种常见设计思路,核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化, 只需要调整页面元素封装的代码 (摘自:https://github.com/SeleniumHQ/selenium/wiki/PageObjects) 优点 业务代码和测试代码分离,降低耦合易于管理 减少冗余代码 小例子 我们以PO
3.自动化测试用例与功能用例有什么区别? 自动化测试用例和功能测试用例的区别就是每一步都要非常的清楚。 所以才需要做评审。 功能是一样的,意味着用例很多都是一样的。 实际工作中,预期结果这块可能要比对3-4个条件,这种情况下,你的断言就要出现3-4个断言。在功能测试用例这块做了筛选,再去写自动化测试用例,最起码心中有底,知道该怎么实现了。 6.自动化测试用例必备3大步骤:前置、步骤、断言 没有断言的都不叫做测试用例。 7.PageObject模式测试思想: 例如有140个用例,都是测试人员在系统当中的页面之间操作。 这种模式适合页面级别的自动化,例如pc端、app测试、网页测试,只要操作是在页面上点来点去的,通用这种模式。 这个就是分层设计思想,测试领域用,开发就是用这个思想的,独立、好维护、又有关联性。
前言: 我们为什么要用到PO模式?因为随着时间的迁移。测试套件将持续的增长,脚本也将变得越来越多。如果需要维护10个页面,100个页面,甚至1000个呢? ui自动化中,常用的一种方式,引入Page Object(PO):页面对象模式来解决,po能让我们的测试代码变得可读 性更好,可维护性高,复用性高。 PO是什么: 1、页面对象模型(PO)是一种设计模式,用来管理维护一组web元素的对象库 2、在PO下,应用程序的每一个页面都有一个对应的page class 3、每一个page class维护着该 web页的元素集和操作这些元素的方法 4、page class中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟, PO的优势: 1、PO提供了一种业务流程与页面元素操作分离的模式 3、可复用的页面方法代码会变得更加优化 4、更加有效的命名方式使得我们更加清晰的知道方法所操作的UI元素。
selenium之PO模式 PO模式的精髓:测试对象和测试用例的分离 Page Object的设计思想上是把元素定位和元素操作进行分层,这样带来的最直接的好处是当元素发生变化时,只需维护page层的定位 下边以百度搜索为例来通过代码来说明PO模式 1.封装常用的元素操作 base.py import time from selenium import webdriver class BasePage
1、PO模式是什么? : # 省略了start启动 browser = playwright.chromium.launch(headless=False, slow_mo=1000) # 设置了每步等待时间为3s 模式我们怎么做呢? search_page.screenshot('result_search_page') # 截图保存 search_page.close() # 关闭浏览器 运行一下,看下是否正常运行,我这里看的搜索结果截图已经生成了 3、 总结 PO模式看着非常麻烦,但是在较多页面使用时,是便于我们理解代码便于维护的,比如上边如果定位元素有变动,我们就去element层修改对应的定位元素,如果操作有变动,我们就去page层修改对应的页面操作
能够采用继承的思想对PO模式进行深入的封装 1. V6版本 把共同操作提取封装到父类中,子类直接调用父类的方法,避免代码冗余 1. 对象库层-基类,把定位元素的方法定义在基类中 2. 操作层-基类,把对元素执行输入操作的方法定义在基类中 1.1 示例代码 # base_page.py from po.utils import DriverUtil class BasePage """ element.clear() element.send_keys(text) from selenium.webdriver.common.by import By from po.v6
Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class(封装在一个class类中),其中包含页面中需要测试的所有元素(按钮,输入框,标题等)的属性和操作 Class文件),而不需要修改测试代码 它的好处如下: 集中管理元素对象 集中管理一个page内的公共方法 后期维护方便 一、测试用例:使用单元测试框架 二、业务模块:使用 Page Object 设计模式 成为 DbDriver,支持数据库测试 封装接口测试工具 成为 ServiceDriver,支持集成测试,接口测试 封装 Appium工具 成为 AppDriver,支持移动APP UI自动化测试 PO
使用UI自动化测试工具时(包括selenium,appium等),如果无统一模式进行规范,随着用例的增多会变得难以维护,而 PageObject 让自动化脚本井井有序,将 page 单独维护并封装细节, 这里仅用HTML描述Page Object,这种模式还可以用来隐藏Java swing UI细节,它可用于所有UI框架。 原则四:点击一个按钮会开启新的页面,可以用return方法表示跳转,比如return MainPage()表示跳转到新的PO:MainPage。 原则五:只为页面中重要的元素进行PO设计,舍弃不重要的内容。 _driver.implicitly_wait(3) # 访问网页 self._driver.get(self.
目前比较普遍的做法是使用PO模式(Page Object Model)。 下面就简单介绍一下PO模式: Page Object Model的核心是分离测试对象和测试数据。 GoToUrl("192.168.0.1/portal"); //调用Object类中相应的方法实现对应需求 ... } } PO 模式就是Page + Object。
PO模式简介 1.什么是PO模式 PO模型是:Page Object Model的简写 页面对象模型 作用:就是把测试页面和测试脚本进行分离,即把页面封装成类,供测试脚本进行调用; 分层机制,让不同层去做不同类型的事情 PO设计模式是Selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装 2. 不使用PO设计会出现以下几种情况: 复用性不太好,扩展性不好,易读性差,不好维护,UI界面频繁的项目维护起来比较麻烦。 3.PO模式的优缺点 优点: 提高代码的可读性 减少了代码的重复 提高代码的可维护性,特别是针对UI界面频繁的项目 缺点: 造成项目结构比较复杂,因为是根据流程进行了模块化处理 发布者:全栈程序员栈长
Selenium-PO设计模式 PO(page object)设计模式是在自动化中已经流行起来的一种易于维护和减少代码的设计模式。在自动化测试中,PO对象作为一个与页面交互的接口。 PO设计模式具有以下优点: 1、测试代码与页面的定位代码(如定位器或者其他的映射)相分离。 2、该页面提供的方法或元素在一个独立的类中,而不是将这些方法或元素分散在整个测试中。 首先,思考一个不使用PO模式的自动化测试的典型案例: /*** * Tests login feature */ public class Login { public void testLogin 可以在以下登录页面的示例中应用PO设计模式重写此示例。 PO不一定需要代表整个页面。PO设计模式可用于表示页面上的组件。如果自动化测试中的页面包含多个组件,则每个组件都有单独的页面对象,则可以提高可维护性。
能够采用PO模式的分层思想对页面进行封装 1. V4版本 采用PO模式的分层思想对代码进行拆分 1.1 PO分层封装 对登录页面进行分层封装: 对象库层:LoginPage 操作层:LoginHandle 业务层:LoginProxy 调用业务层的方法 ,编写测试用例: 测试用例:TestLogin 1.2 示例代码 from po.utils import DriverUtil class LoginPage: """ 对象库层 "" import utils from po.utils import DriverUtil from po.v4.page.login_page import LoginProxy V5版本 对PO分层之后的代码继续优化 1. 优化对象库层的代码,抽取元素的定位方式,把定位信息定义在对象的属性中,便于集中管理 2.
设计模式 在了解PO模式之前,我们先了解下什么是设计模式。下面这段话摘录其他文章: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 面向对象编程只是一种编程概念,通过在网络上调研了解,PO模式广泛运用在测试自动化领域。 特点: 1、页面对象模型(PO)是一种设计模式,用来管理维护一组页面元素的对象库。 2、在PO下,应用程序的每一个页面都有一个对应的Page类。 3、每一个Page类维护着该页面的元素集和操作这些元素的方法。 优点: 1、代码可读性强: 有层次的设计感,让协同开发脚本的同学也能快速读懂代码。 3、复用性高: 写其他测试用例,可以复用基础方法。 怎么设计PO?
(3)只管理一台主机太不爽了吧,我想查看多台服务器的日志怎么办?同样可以! ? (4)上面的功能用的如何是不是挺强大的?但是我发现问题了。 ?
在写这两个脚本之前,我先对WebDriver中的一些方法进行重定义,以方便我们在写PO的时候,更简洁,快速。 click() #用户名或密码不合理是Tip框内容展示 def show_span(self): return self.find_element(*self.span_loc).text #切换登录模式为动态密码登录 -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import unittest from PO
PO是什么: PO模式,Page Object的缩写,页面对象,设计框架的思想,分层思想 在PO下,应用程序的每一个页面都有一个对应的page class 每一个page class维护着该web页的元素集和操作这些元素的方法 page class中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟 PO的优势: PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰 页面对象与用例分离 页面的配置信息写在这个包的__init__里面 把页面的步骤组合在一起形成一个业务 pageAction包 测试用例的书写,case层,跟单元测试框架结合使用,断言,参数化,报告 case包 普通模式 模式: 页面操作page_login.py import pageObject import allure from base.baseApi import Base class PageLogin( 登录页面 3个步骤 3. index页面 1个步骤 ''' def login_success(self): # 点击登录链接 self.pageindex.click_login_link
1.页面对象模型(PO)是一种设计模式,用来管理维护一组页面元素的对象库. 2.在PO下,应用程序的每一个页面都有一个对应的Page类. 3.每一个Page类维护着该页面的元素集和操作这些元素的方法. PO的好处? 1.代码可读性强 2.可维护性高 3.复用性高 怎么设计PO? 中实现这些功能方法 下面我们看下PO的代码目录组织示例: PO的优势 1、PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰。 3、可复用的页面方法代码会变得更加优化 4、更加有效的命名方式使得我们更加清晰的知道方法所操作的UI元素。 PO实现示例 下面看下使用PO设计模式构建的百度搜索用例,先看下代码组织结构如下: #basePage.py代码如下 #searchPage.py代码如下 #testSearchPage.py