PO模式在selenium自动化测试框架的优势_第1页
PO模式在selenium自动化测试框架的优势_第2页
PO模式在selenium自动化测试框架的优势_第3页
PO模式在selenium自动化测试框架的优势_第4页
PO模式在selenium自动化测试框架的优势_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第PO模式在selenium自动化测试框架的优势PO模型是:PageObjectModel的简写页面对象模型

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

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

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

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

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

3.PO模式的优缺点

优点:

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

缺点:

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

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

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

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

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

没有使用PO模式时

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

deftest_login_mail(self):

driver=self.driver

driver.get("")

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

deftest_login_mail(self):

LoginPage(driver).login()

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

classLoginPage:

username_loc=(By.ID,"idInput")

password_loc=(By.ID,"pwdInput")

submit_loc=(By.ID,"loginBtn")

span_loc=(By.CSS_SELECTOR,"div.error-ttp")

dynpw_loc=(By.ID,"lbDynPw")

userid_loc=(By.ID,"spnUid")

def__init__(self,driver):

self.driver=driver

deflogin(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方式来表示元素,所有的元素统一放在一起,修改起来也比较方便。

classLoginPage:

def__init__(self,driver)

self.driver=driver

@property

defusername_element(self):

returnself.driver.find_element('id','idInput')

defpassword_element(self):

returnself.driver.find_element('id','pwdInput')

defsubmit_element(self):

returnself.driver.find_element('id','loginBtn')

deflogin(self,name,password):

self.username_element.send_keys(name)

self.password_element.send_keys(password)

self.submit_element.click()

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

classLoginPage:

def__init__(self,driver)

self.driver=driver

username=Element(css='#idInput',desc='用户名输入框')

password=Element(css='#pwdInput',desc='密码输入框')

confirm=Element(css='#loginBtn',desc='登录确认按钮')

deflogin(self,name,password):

self.username.send_keys(name)

self.password.send_keys(password)

self.confirm.click()

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

classElement:

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)

returnel

PO模式和DDD

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

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

user.login()

login(user)

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

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

classLoginPage:

username_filed=InputElement('xxx')

password_filed=PasswordElement('xxx')

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

便于维护。每一个页面的操作都被单独的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论