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

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

用Python编码时,会使用自己的编码设计格式,比如最常见的singleton模式。本文将为大家介绍PageObject自动设计模式(PO模式)的设计与实现。有兴趣的可以看看。

目录

PO模式PO三层模式PO设计模式有什么优势?将重写的脚本转换为PO设计模式。构建基本的BasePage层。建立主页的页面层。构建登录页面。建立主页-订单-支付流程的页面层。设置订单页面。在Python中编码时,模式下测试用例的转换会使用自己的编码设计格式,比如最常见的singleton模式、略显抽象的抽象工厂等……在使用Python做自动化测试时,你是否也有自己的设计模式?因此,在今天的小章节中,我们需要更多地了解python作为自动化测试中的一种设计模式,尤其是UI自动化的专属模式——“page object”自动化设计模式,简称“PO模式”。

并实现了“页面对象”的自动设计模式

什么是PO模式

测试自动化中流行的设计模式可以减少自动化测试脚本的代码量,避免代码重复,使它们更容易阅读,并降低维护成本。

其实简单来说就是页面操作、脚本用例、通用页面元素分离的这样一种模式。

一般PO设计模式大多分为三层。

PO 三层模式

第一层:(核心、BasePage层)

对Selenium底层进行第二次封装,定义一个基本属性页面——base page,所有页面都继承。封装Selenium的基本方法,如:元素定位、元素等待、导航页、页面跳转等.PS:其实在使用的过程中不需要全部封装,需要多少方法就封装多少。(之前接触过其他大佬的自动化框架,他把selenium的底层方法都封装在一个层里。这是做很多事情的好方法,但是比较笨重。实际在实际使用中没有那么多用,所以不建议全部打包)。

第二层:(页面层、也叫配置层)

页面是分开的,每个元素只定位一次,而且是孤立定位的。如果页面发生变化,只需改变相应的元素定位。如果有一些业务属性和方法,就需要通过业务方法把业务和运营要素的动作分开。

第三层:(封装测试层)

使用单元测试框架封装和测试业务逻辑。

PO 设计模式的优点

UI的频繁变化导致页面上UI元素的频繁变化,PO设计模式方便了元素定位变化的维护。

在传统的线性自动化中,同一个元素需要在多个用例脚本中重复定位,PO设计模式可以减少频繁定位元素的代码量。

Section:减少重复代码冗余,方便UI页面频繁变化下的元素定位和维护。

将改写的脚本转为PO设计模式

首先在项目中创建一个名为pages的python包,然后在pages中创建一个模块base_page.py作为第一层base_page的核心层。

如下图:

构建基础的 BasePage 层

尽量搭建最基础的base_page层。代码示例如下:

#编码:utf-8

从selenium导入web驱动程序

类基页(对象):

'''

1.第一层——核心层——base page层,定义了一个被所有页面继承的页面层。

2.第二个包装硒的基本方法是使用。

'''

Def _ _ init _ _ (self,driver,path=none): #构造函数,类的初始化

'''

为了便于编写,初始化驱动程序,

使用' self.driver=webdriver。Chrome()'然后改成self.driver=driver。

'''

self.driver=webdriver。铬合金()

# self.driver=驾驶员

Self.driver.implicit _ wait (5) #定义全局默认加载时间。

Self.load_page(path) #访问并加载一个网页

DEF _ PAGE (self,path=none): #访问并加载网页,如果路径不为空,直接传递给driver.get()进行访问。

如果路径不是无:

self.driver.get(路径)

def by_xpath(self,xpath): #二次封装硒的xpath元素定位

返回自我。司机。通过XPath查找元素(XPath)

def js_click(self,xpath): # JavaScript定位元素,并执行点击

自我。司机。execute _ script(' arguments[0]).click()',self.by_xpath(xpath))

到这里,base_page层算是写完了,这就是一个最底层、最基础的类,这个类让我们实现了硒底层的Xpath定位方法与Java脚本语言定位元素方法,这些方法能够帮助我们更好的去完成后续的定位处理操作。

好吧,接下我们再去编写各个页面层的东西。

构建首页的 Page 层(HomePage)

代码示例如下:

#编码:utf-8

从硒导入网驱动程序

从页面. base_page导入基本页#导入base_page层

班级主页(基本页):#定义首页(继承基础页面)

'''

1、第二层-各个页面单独封装成层,页面的元素、操作、流程

'''

定义直接登录(自己):#首页跳转至登录页

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/div[5]/div[3]')

定义直接产品(自身):#登陆成功后,跳转至首页

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/div[5]/div[1]')

# 方法流程

定义交叉登录(自己):

self.direct_to_login().单击()#点击'登录' 按钮进行登录

定义交叉到产品(自身):

self.direct_to_product().单击()#点击'首页' 跳转至首页

构建登录页的 Page 层(LoginPage)

代码示例如下:

#编码:utf-8

从硒导入网驱动程序

从页面. base_page导入基本页#导入base_page层

类登录页面(基本页面):#定义首页(继承基础页面)

'''

1、页面层(登录页) - 各个页面单独封装成层,页面的元素、操作、流程

'''

定义登录用户名(自己):#登录页-用户名输入框

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/form/div[1]/div[2]/div/input ')

定义登录密码(自己):#登录页-密码输入框

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/form/div[2]/div[2]/div/input ')

定义登录按钮(自身):#登录页-登录按钮

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/form/div[3]/button ')

# 登录情况

定义登录(自己、用户名、密码):#登录方法,传入用户名与密码

self.login_username().发送键(用户名)

self.login_password().发送键(密码)

self.login_button().单击()

构建 首页 - 订单 - 支付 流程的 Page 层(OrderPage)

#编码:utf-8

从时间进入睡眠

从页面. base_page导入基本页#导入base_page层

class OrderPage(BasePage): #定义首页(继承基础页面)

'''

1、页面层(登录页) - 各个页面单独封装成层,页面的元素、操作、流程

'''

定义产品(自身):#下单-第一个产品

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/div[4]/div[2]/a[1]')

def ticket_book(self): #门票-预定(按钮)

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/div[5]/div[2]/div[2]/a ')

定义预订日期(自身):#门票-选择日期

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/form/div[1]/div[1]/div[2]/div/input ')

延期交货订单(自身):#门票下单

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/form/div[4]/div/button ')

定义付款(自己):#门票下单-支付

回归自我。by _ XPath('//*[@ id=' app ']/div[1]/form/div/div/button ')

定义确认(自我):#门票下单-确认支付

返回自我。by _ XPath('/html/body/div[5]/div[3]/button[2]')

# 下单成功情况

定义订单(自己):

self.product()。单击()

self.ticket_book().单击()

self.book_date().send_keys('2022-06-16 ')

self.to_order()。单击()

睡眠(2)

element=self.pay_off()

自我。司机。execute _ script(' arguments[0]).单击()',元素)

睡眠(2)

以上,我们准备的所有页面的元素定位和基线流程都完成了,但是具体用例应该怎么实现呢?继续往下看。

PO 设计模式下测试Case的改造

代码示例如下:

#编码:utf-8

导入单元测试

从时间进入睡眠

从selenium导入web驱动程序

从pages.home_page导入主页

从pages.login_page导入登录页面

from pages.order_page导入订单页面

'''

1.初始化-打开浏览器并设置浏览器大小。

2.最终操作-关闭浏览器。

3.用例部分-登录和购买操作、下订单和支付。

'''

类TestTravel(unittest。测试用例):

@classmethod

SetUpClass (CLS): #每个测试类在加载初始化方法之前执行一次SetUpClass。

cls.driver=webdriver。铬合金()

cls.driver.maximize_window()

定义测试_订单(自身):

#初始化参数

用户名='13500000001 '

密码='成功@2020 '

#初始化接口

home _ page=home page(driver=self . driver,path=' http://django . t . mukewang . com/#/')

log in _ page=log in page(driver=self . driver)

order _ page=order page(driver=self . driver)

#跳转登录

主页.交叉登录()

#登录

login_page.login(用户名、密码)

#跳转到订单页面

home_page.cross_to_product()

#订单

order_page.place_order()

@classmethod

def tearDownClass(cls):

Cls.driver.quit() #完全退出浏览器

if __name__=='__main__ ':

unittest.main()

请记住取消注释“BasePage layer”的“# self.driver=driver”,并注释掉“self.driver=webdriver”。Chrome()'在这里改造后。

以上是通过PO的方式将三个页面与基本的base_page连接起来编写的一个更加完整简洁的测试用例。

运行结果如下:(速度可能太快了,不好意思,gif只用15秒)

关于用Python设计和实现PO模式的文章到此结束。有关Python PO模式的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: