用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。