当前位置:   article > 正文

PO模式详解

po模式

PO模式
  • PO模式是page object的缩写,是一种设计模式

  • 被测页面作为页面对象1,其中包含元素定位和元素操作的方法,将页面对象和真实网站页面进行一一对应

  • 举个栗子来讲:用户注册使用PO模式后,操作步骤如下:

    1. 创建class,该类就是登录页面对象类
    2. 类的属性:用户注册框、密码框和注册按钮的element
    3. 类的方法:各种元素的操作方法
      1. 方法中对selenium进行二次封装2
      2. 用例层直接调用其中方法即可,不需要关注其他
    4. 测试层从页面操作层调用其中方法,实现用例和元素方法的分离
  • PO模式分层机制3

    • 对象库层:二次封装selenium的方法
    • 页面操作层:封装页面元素对象和元素操作方法
    • 业务层:多个页面操作完成一个业务测试,一般结合单元测试框架(pytest、unittest)来进行测试
    • 如下图:

在这里插入图片描述

PO模式的优点

说到PO模式的有点必须要说到非PO模式进行对比可能会更加明显

在这里插入图片描述

非PO模式PO模式
面向过程的线性脚本4页面元素和业务操作分离,实现了松耦合5
复用性差UI元素改变后不需大规模修改只需要修改页面操作层即可
维护性差PO的可读性比较高6
用例实现

Exp:用户注册为例进行编写

实现BasePage类:

#BasePage.py 
from selenium import webdriver
class BasePage(object):
    #初始化driver
    def __init__(self, driver):
        self.driver = driver
    # 访问页面
    def visit(self,url):
        self.driver.get(url)

    # 元素定位
    def locator(self, locator):
        return self.driver.find_element(*locator)

    # 关闭浏览器
    def quit_driver(self):
        self.driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

实现注册类:

  1. 继承Base类
  2. 将页面元素标识在属性中(页面元素,url等)
  3. 添加操作行为(文本输入)
  4. 添加被测函数
#Register.py
from basepage.base_page import BasePage
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


class Register(BasePage):

    # 页面元素发生变化时,维护好当前元素路径即可
    input_username = (By.ID, 'kw')
    input_pwd = (By.ID, 'passwd')
    click_id = (By.ID, 'su')

    # 输入元素
    def input_text(self, input_text):
        self.locator(self.input_id).send_keys(input_text)
    
    # 点击注册按钮
    def click_element(self):
        self.locator(self.click_id).click()

    # 测试
    def check(self, url, input_text):
        self.visit(url)
        self.input_text(input_text)
        self.click_element()
if __name__ == '__main__':
    url = 'https://www.baidu.com'
    driver = webdriver.Chrome()
    sp = SearchPage(driver)
    sp.check(url, '软件测试')
    sp.quit_driver()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

测试用例实现:

#test_register.py
from basepage.base_page import BasePage
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

class RegisPage(BasePage):
    url = 'https://www.test.com'
    link_id = (By.LINK_TEXT,'注册')

    # 用户名
    username = (By.ID,'pwd')
    # 密码
    pwd = (By.ID,'pwd')

    # 注册按钮
    btn = (By.XPATH,'//*[@id="TANGRAM__PSP_11__submit"]')

    # 弹出登录框
    def click_link(self):
        self.locator(self.link_id).click()

    # 点击用户名密码注册
    def click_user(self):
        self.locator(self.uname_pwd).click()

    # 输入用户名
    def input_username(self,input_username):
        self.locator(self.username).send_keys(input_username)

    # 输入密码
    def input_pwd(self,input_pwd):
        self.locator(self.pwd).send_keys(input_pwd)

    # 点击注册
    def click_register(self):
        self.locator(self.btn).click()

if __name__ == '__main__':
    driver = webdriver.Chrome()
    sp = LoginPage(driver)
    sleep(3)
    sp.check('username','pwd')
    sleep(8)
    sp.quit_driver()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

  1. 讲被测页面进行抽象,使用面向对象的思想进行看待 ↩︎

  2. 不止对于selenium会进行基础方法的封装对于接口自动化中的requests也会进行二次封装 ↩︎

  3. 这里的分层机制主要对上述步骤中的类创建方法使用PO模式进行说明 ↩︎

  4. 线性脚本是所有复杂脚本编写的基础,也就是每个实现过程都进行编写但是相互独立 ↩︎

  5. 耦合就是用例之间没有运行过程中的关联关系,松耦合就是用例之间没有关联关系,没有先后关系 ↩︎

  6. 可读性指的是框架结构明显方便执行者的阅读和执行 ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/540048
推荐阅读
相关标签
  

闽ICP备14008679号