返回顶部
首页 > 资讯 > 后端开发 > Python >一文详解Python中PO模式的设计与实现
  • 950
分享到

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

2024-04-02 19:04:59 950人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是PO模式PO 三层模式PO 设计模式的优点将改写的脚本转为PO设计模式构建基础的 BasePage 层构建首页的 Page 层(HomePage)构建登录页的 Page 层

在使用 python 进行编码的时候,会使用自身自带的编码设计格式,比如说最常见的单例模式,稍微抽象一些的抽象工厂模式等等… 在利用 Python自动化测试的时候,是不是也有自己的设计模式呢?所以在今天这个小章节里,需要续了解的就是 python 作为自动化测试里面的一种设计模式,尤其是 UI自动化 的专属模式 —> “PageObject” 自动化设计模式,简称 “PO模式” 。

了解并实现 “PageObject” 自动化设计模式

什么是PO模式

一种在测试自动化中变得流行的设计模式,使得自动化测试脚本的代码量减少,避免代码重复,更加易读,减少维护的成本。

其实简单来说就是将页面的操作、脚本的Case、通用的页面元素分开的这样一个模式。

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

PO 三层模式

第一层:(核心、BasePage层)

  • selenium 的底层进行二次封装,定义一个所有页面都继承的基础属性页面 —> BasePage 。
  • 封装 Selenium 的基本方法,例如:元素定位、元素等待、导航页面、页面跳转等等...
  • PS:其实在使用的过程中不需要全部封装,用到多少方法就封装多少方法即可。(之前接触过其他大佬的自动化框架,他把所有的 selenium 的底层的方法做了一层封装,这样做很好,能够做很多的事情,但是比较繁重。实际上在真实使用的时候用不到那么多,所以不建议全部封装)。

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

  • 页面元素进行分离,每个元素只定位一次,隔离定位。如果页面改变,只需要改变相应的元素定位。
  • 如果存在一些业务的属性、方法,需要将其通过业务方法的方式将业务与操作元素的动作分离开来。

第三层:(封装测试层)

使用单元测试框架对业务逻辑进行封装测试

PO 设计模式的优点

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

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

小节:减少重复代码的冗余,便于UI页面频繁变更下的元素定位维护。

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

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

如下图:

构建基础的 BasePage 层

尝试构建最基础的 base_page 层,代码示例如下:

# coding:utf-8
from selenium import WEBdriver

class BasePage(object):
    """
    1、第一层 - 核心层-BasePage层,定义一个所有页面都继承的page层
    2、对将要使用的 selenium 的底层方法进行二次封装
    """

    def __init__(self, driver, path=None):     # 构造函数,类的初始化
        """
        为了方便编写将 driver 初始化,
        先使用 "self.driver = webdriver.Chrome()" 后续改为 self.driver = driver
        """
        self.driver = webdriver.Chrome()
        # self.driver = driver
        self.driver.implicitly_wait(5)  # 定义全局的默认加载时间
        self.load_page(path)            # 访问并加载网页

    def load_page(self, path=None):     # 访问并加载网页,如果 path 不为空的话,直接传给 driver.get() 访问
        if path is not None:
            self.driver.get(path)

    def by_xpath(self, xpath):          # 二次封装 selenium 的 xpath 元素定位
        return self.driver.find_element_by_xpath(xpath)

    def js_click(self, xpath):          # javascript 定位元素,并执行 click
        self.driver.execute_script('arguments[0].click()', self.by_xpath(xpath))

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

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

构建首页的 Page 层(HomePage)

代码示例如下:

# coding:utf-8

from selenium import webdriver
from pages.base_page import BasePage    # 导入 base_page 层

class HomePage(BasePage):      # 定义 FirstPage(继承 BasePage )
    """
    1、第二层 - 各个页面单独封装成层,页面的元素、操作、流程
    """
    def direct_to_login(self):      # 首页跳转至登录页
        return self.by_xpath("//*[@id='app']/div[1]/div[5]/div[3]")

    def direct_to_product(self):    # 登陆成功后,跳转至首页
        return self.by_xpath("//*[@id='app']/div[1]/div[5]/div[1]")

    # 方法流程
    def cross_to_login(self):
        self.direct_to_login().click()  # 点击 "登录" 按钮进行登录

    def cross_to_product(self):
        self.direct_to_product().click()    # 点击 "首页" 跳转至首页

构建登录页的 Page 层(LoginPage)

代码示例如下:

# coding:utf-8
from selenium import webdriver
from pages.base_page import BasePage    # 导入 base_page 层

class LoginPage(BasePage):      # 定义 FirstPage(继承 BasePage )
    """
    1、页面层(登录页) - 各个页面单独封装成层,页面的元素、操作、流程
    """
    def login_username(self):    # 登录页 - 用户名输入框
        return self.by_xpath("//*[@id='app']/div[1]/fORM/div[1]/div[2]/div/input")

    def login_password(self):    # 登录页 - 密码输入框
        return self.by_xpath("//*[@id='app']/div[1]/form/div[2]/div[2]/div/input")

    def login_button(self):      # 登录页 - 登录按钮
        return self.by_xpath("//*[@id='app']/div[1]/form/div[3]/button")

    # 登录Case
    def login(self, username, passWord):    # 登录方法,传入 username 与 password
        self.login_username().send_keys(username)
        self.login_password().send_keys(password)
        self.login_button().click()

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

# coding:utf-8

from time import sleep
from pages.base_page import BasePage    # 导入 base_page 层

class OrderPage(BasePage):      # 定义 FirstPage(继承 BasePage )
    """
    1、页面层(登录页) - 各个页面单独封装成层,页面的元素、操作、流程
    """
    def product(self):    # 下单 - 第一个产品
        return self.by_xpath("//*[@id='app']/div[1]/div[4]/div[2]/a[1]")

    def ticket_book(self):  # 门票 - 预定(按钮)
        return self.by_xpath("//*[@id='app']/div[1]/div[5]/div[2]/div[2]/a")

    def book_date(self):    # 门票 - 选择日期
        return self.by_xpath("//*[@id='app']/div[1]/form/div[1]/div[1]/div[2]/div/input")

    def to_order(self):     # 门票下单
        return self.by_xpath("//*[@id='app']/div[1]/form/div[4]/div/button")

    def pay_off(self):      # 门票下单 - 支付
        return self.by_xpath("//*[@id='app']/div[1]/form/div/div/button")

    def confirm(self):      # 门票下单 - 确认支付
        return self.by_xpath("/html/body/div[5]/div[3]/button[2]")

    # 下单成功Case
    def place_order(self):
        self.product().click()
        self.ticket_book().click()
        self.book_date().send_keys("2022-06-16")
        self.to_order().click()
        sleep(2)
        element = self.pay_off()
        self.driver.execute_script('arguments[0].click()', element)
        sleep(2)

以上,我们准备的所有页面需要准备的元素定位、基线流程算是写完了,但是具体的用例,应该如何实现呢?继续往下看。

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

代码示例如下:

# coding:utf-8

import unittest
from time import sleep
from selenium import webdriver
from pages.home_page import HomePage
from pages.login_page import LoginPage
from pages.order_page import OrderPage

'''
1、初始化 - 打开浏览器,设置浏览器大小
2、最终操作 - 关闭浏览器
3、用例部分 - 登录 与 购买操作、下订单、支付
'''

class TestTravel(unittest.TestCase):
    @claSSMethod
    def setUpClass(cls):                    # 每个测试类在加载之前执行一次 setUpClass ,初始化方法
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()

    def test_a_order(self):
        #初始化参数
        username = '13500000001'
        password = 'Success@2020'

        #初始化界面
        home_page = HomePage(driver=self.driver, path="Http://Django.t.mukewang.com/#/")
        login_page = LoginPage(driver=self.driver)
        order_page = OrderPage(driver=self.driver)

        #跳转登录
        home_page.cross_to_login()

        #登录
        login_page.login(username, password)

        # 跳转至订单页
        home_page.cross_to_product()

        #下单
        order_page.place_order()


    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()       # 彻底退出浏览器


if __name__ == '__main__':
    unittest.main()

这里改造完成之后,记得将 "BasePage 层" 的 '# self.driver = driver' 取消注释,并将 'self.driver = webdriver.Chrome()' 注释掉 。

以上就是一个比较完整的通过 PO 的方式来连接三个页面与基础的 base_page 来写出的更简洁一些的测试用例。

运行结果如下:(速度可能过快,担待一下,gif 只有15秒的时间)

到此这篇关于一文详解Python中PO模式的设计与实现的文章就介绍到这了,更多相关Python PO模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文详解Python中PO模式的设计与实现

本文链接: https://lsjlt.com/news/118695.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文详解Python中PO模式的设计与实现
    目录什么是PO模式PO 三层模式PO 设计模式的优点将改写的脚本转为PO设计模式构建基础的 BasePage 层构建首页的 Page 层(HomePage)构建登录页的 Page 层...
    99+
    2024-04-02
  • Python中PO模式如何设计与实现
    本文小编为大家详细介绍“Python中PO模式如何设计与实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中PO模式如何设计与实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是PO模式一种在测...
    99+
    2023-07-02
  • python中的PO设计模式
    PO (Page Object) 设计模式是一种在测试自动化中使用的设计模式,用于将页面对象从测试代码中分离出来,以提高代码的可维护...
    99+
    2023-09-14
    python
  • 一文详解Golang的中间件设计模式
    目录背景Demo验证结论背景 记录一下自己在go开发和学习上的一些笔记 最近在看一些rpc框架的使用原理和源码的时候,对中间件的实现非常感兴趣,然后也看了一下grpc的中间件的用法,...
    99+
    2023-03-06
    Golang中间件设计模式 Golang中间件 Go 中间件
  • 一文详解Go语言中的Option设计模式
    关于什么是设计模式,笔者在这里就不做过多的解释。大家自行百度谷歌就好。下面我们聊聊Option设计模式,这个单词翻译过来就是选项的意思。 它一般都是用在初始化数据的时候使用。 typ...
    99+
    2023-05-19
    Go Option设计模式 Go 设计模式 Go Option
  • Python设计模式中的策略模式详解
    目录策略模式命令模式策略模式 策略模式是一个经典的模式,简化代码。 电商领域有个功能明细可以使用“策略”模式,就是根据客户的属性或订单中的商品计算折扣。 比如...
    99+
    2023-02-08
    Python策略模式 Python设计模式
  • java 中设计模式(装饰设计模式)的实例详解
    java 中设计模式(装饰设计模式)的实例详解应用场景:在不对原有对象类进行修改的基础上,给一个或多个已有的类对象提供增强额外的功能. 我觉得可以从字面理解,装饰,装饰房子。房子可以看成原有的类。等于你把一个已经建好的房子按照自己的想法再装...
    99+
    2023-05-31
    java 装饰模式 ava
  • Python 中的设计模式详解之:策略模
    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。《设计模式:可复用面向对象软件的基础》一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”。 1、策略模式概述 策略模式:定义一系列算法,把...
    99+
    2023-01-31
    详解 策略 模式
  • Appium PO模式UI自动化测试框架——设计与实践
        😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的...
    99+
    2023-09-02
    python 自动化 测试工具
  • 详解Python设计模式编程中观察者模式与策略模式的运用
    观察者模式 观察者模式:又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时,会通知所有观察者对象,是他们能自动更新自己。 代码结构 cla...
    99+
    2022-06-04
    模式 观察者 详解
  • 详解Java实现设计模式之责任链模式
    目录一、模拟业务需求二、小步小跑的迭代开发三、系统对数据的校验要求四、新建一个抽象类五、子类的实现六、构建责任链和调用七、可维护性八、总结8.1、责任链模式8.2、责任链模式适用的场...
    99+
    2024-04-02
  • java设计模式-单例模式实现方法详解
    目录饿汉式静态变量静态代码块懒汉式线程不安全线程安全双重检查静态内部类总结单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要...
    99+
    2024-04-02
  • C++实现设计模式之装饰者模式详解
    目录设计模式和设计原则装饰者模式中的类案列描述代码实现总结设计模式和设计原则 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者模式提供了比继承更有弹性的替代方案。 装饰者模式...
    99+
    2024-04-02
  • 一文详解Java的饿汉和懒汉设计模式
    目录饿汉设计模式懒汉设计模式饿汉和懒汉模式的区别本文主要讲述java的饿汉和懒汉设计模式 饿汉和懒汉设计模式的目的:使得该类的对象,只能有一个,不允许其他类,创建该类的对象。 饿汉设...
    99+
    2022-12-20
    Java饿汉 懒汉 设计模式 Java饿汉设计模式 Java 懒汉设计模式 Java 设计模式
  • Python设计模式中命令模式怎么实现
    这篇文章主要介绍了Python设计模式中命令模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python设计模式中命令模式怎么实现文章都会有所收获,下面我们一起来看看吧。1.命令模式命令模式的目的是解...
    99+
    2023-06-29
  • 一文详解Python中实现单例模式的几种常见方式
    目录Python 中实现单例模式的几种常见方式元类(Metaclass):装饰器(Decorator):模块(Module):new 方法:Python 中实现单例模式的几种常见方式...
    99+
    2023-03-22
    Python 单例模式 Python 单例
  • 详解java设计模式中的门面模式
    门面模式又叫外观模式(Facade Pattern),主要用于隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。 我们知道电视剧操作很简单,但是里面的设计和原理很少人明...
    99+
    2024-04-02
  • Java设计模式中的外观模式详解
    目录模式介绍UML类图外观模式案例:外观模式的注意事项和细节模式介绍 外观模式(Facade) ,也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定...
    99+
    2024-04-02
  • Java设计模式中的门面模式详解
    目录门面模式概述应用场景目的优缺点主要角色门面模式的基本使用创建子系统角色创建外观角色客户端调用门面模式实现商城下单库存系统支付系统物流系统入口系统客户端调用门面模式 概述 门面模式...
    99+
    2024-04-02
  • 详解Java设计模式中的装饰模式
    目录一、装饰模式的定义和特点二、装饰模式的结构三、咖啡点单案例演示四、总结一、装饰模式的定义和特点 在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作