2.3.3 PO模式

无模式-V1版本

      不使用任何设计模式和单元测试框架。每个文件里编写一个用例,完全的面向过程的编程方式。

  • 存在的问题

    一条测试用例对应一个文件,用例较多时不方便管理维护代码高度冗余

  • 示例代码

    登录功能-账号或者密码错误

from  selenium  import  webdriver   # 创建浏览器驱动对象,并完成初始化操作driver  =  webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(10) # #打开网页driver.get("http://123.57.71.195:7878/")# 需要自动化完成登录操作:用户名定位driver.find_element_by_name("username").send_keys("abcdefg")# 密码元素定位driver.find_elements_by_tag_name("input")[1].send_keys("admin888")#登陆按钮元素定位driver.find_element_by_class_name("logindo").click()

无模式-V2版本

 

使用UnitTest管理用例,并断言用例的执行结果

  • 引入UnitTest的好处
    方便组织、管理多个测试用例提供了丰富的断言方法方便生成测试报告减少了代码冗余

  • 存在的问题
    代码冗余

  • 示例代码

import  unittest from  selenium  import  webdriver   class  TestLogin(unittest.TestCase):     """ 对登录模块的功能进行测试 """       def  setUp(self):           self.driver  =  webdriver.Chrome()           self.driver.maximize_window()           self.driver.implicitly_wait(10)             self.driver.get("http://123.57.71.195:7878/")       def  tearDown(self):           self.driver.quit()         # 账号不存在     def  test_login_username_is_error(self):           # 用户名元素定位          self.driver.find_element_by_name("username").send_keys("abcdefg")          # 密码元素定位          self.driver.find_elements_by_tag_name("input")[1].send_keys("admin888")          #登陆按钮元素定位          self.driver.find_element_by_class_name("logindo").click()          # 断言提示信息           msg  =  self.driver.find_element_by_class_name("layui-layer-padding").text             print("msg=",  msg)           self.assertIn("用户名或者密码错误",  msg)         # 密码错误     def  test_login_password_is_error(self):           # 用户名元素定位          self.driver.find_element_by_name("username").send_keys("admin")          # 密码元素定位          self.driver.find_elements_by_tag_name("input")[1].send_keys("weffwef")          #登陆按钮元素定位          self.driver.find_element_by_class_name("logindo").click()          # 断言提示信息           msg  =  self.driver.find_element_by_class_name("layui-layer-padding").text             print("msg=",  msg)           self.assertIn("用户名或者密码错误",  msg)  

为什么用PO

      基于pythonselenium2开始开始ui自动化测试脚本的编写不是多么艰巨的任务。只需要定位到元素,执行对应元素的操作即可。

下面我们看一下这个简单的脚本实现百度搜索。

         从上述代码来看,我们所能做的就是元素的定位,然后进行键盘输入或鼠标动作。就这个小程序而已,维护起来看起来是很容易的。

        但随着时间的迁移,测试套件将持续的增长。脚本也将变的越来越多。如果我们需要维护10个页面,100个页面,甚至1000个呢?

      那么页面元素的任何改变都会让我们的脚本维护变得繁琐复杂,而且变得耗时易出错。

那怎么解决呢?ui自动化中,常用的一种方式,引入Page Object(PO):页面对象模式来解决,po能让我们的测试代码变得可读性更好,可维护性高,复用性高。 

PO概述

1、页面对象模型(PO)是一种设计模式,用来管理维护一组web元素的对象库

2、在PO下,应用程序的每一个页面都有一个对应的page class

3、每一个page class维护着该web页的元素集和操作这些元素的方法

4、page class中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟,

     我们可以这样命名该方法:waitingForLoginSuccess()。

下面我们看下PO的代码目录组织示例:

 

PO的优势

1、PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰。

2、页面对象与用例分离,使得我们更好的复用对象。

3、可复用的页面方法代码会变得更加优化

4、更加有效的命名方式使得我们更加清晰的知道方法所操作的UI元素。例如我们要回到首页,

     方法命名为:gotoHomePage(),通过方法名即可清晰的知道具体的功能实现。

PO实现示例

Base_Page.py部分代码示例:

Login_Page.py部分代码示例:

详细代码关注公众号回复:【PO封装】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zemuerqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值