自动化测试设计模式--POM

自动化测试设计模式--POM_第1张图片

1.1 PO模式的定义

Page Object Mode(POM)模式是一种在自动化测试中常用的设计模式,也叫页面对象模型,简称PO。用于将页面的逻辑和操作封装到一个对象中。每个页面都对应一个Page Object,通过Page Object可以访问页面上的元素和执行操作。Page Object模式可以提高测试脚本的可读性和可维护性,同时也可以减少测试脚本对页面细节的依赖。

在Page Object模式中,通常会将页面的元素(如按钮、输入框、下拉列表等)和操作(如点击、输入、选择等)封装成方法,通过调用这些方法来进行页面操作和断言。这样可以使测试脚本更加简洁,并且当页面发生变化时,只需要修改Page Object而不需要修改所有的测试脚本。

1.2 PO模式设计思想

PO 模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性高,复用性高。

非POM结构将所有代码都写在一个类中,不利于代码维护,代码存在冗余,UI页面元素发生变化需要修改很多地方。

而POM结构将selenium的基础API进行封装为基类,每一个页面的所有定位元素都有一个类(都继承基类),通过继承定位元素类形成业务流,在通过业务流组织成用例。这样降低了代码的耦合性,可以很好的维护代码,就算页面UI进行变动,只需要找到对应的页面元素定位类进行修改即可(自动化分层越详细,越利于维护)。

自动化测试设计模式--POM_第2张图片

2.1 BasePage基类

BasePage基类,封装驱动器对象的获取方法,可以将驱动器对象中的浏览器进行基本设置。然后是打开被测浏览器地址的封装,需要传入URL地址。最后是对元素定位方法的封装。(还可以将其他定位方式以及定位元素的操作封装到BasePage类中)

from selenium import webdriver
from selenium.webdriver.common.by import By

class BasePage:
    def __init__(self, browserType):
        """
        :param browserType: 表示传入浏览器的类型,传入的数据类型为string类型
        """
        # 将输入的字符串字母全部转换为小写
        __type = browserType.lower()
        if __type == "chrome":
            self.get_driver = webdriver.Chrome()
        elif __type == "firefox":
            self.get_driver = webdriver.Firefox()
        else:
            print("请选择正确的浏览器!")

    def open(self, url):
        self.get_driver.get(url)

    # 元素定位封装
    def get_element(self, property, value):
        """
        :param property: 传入元素定位的类型,数据类型为string,值为ID,Name,Xpath,ClassName,Css
        :param value: 表示的是页面上元素属性所对应的值
        :return: 返回元素定位的对象,如果传入的类型或者不存在抛出值异常
        """
        if property == "ID":
            return self.get_driver.find_element(By.ID, value)
        elif property == "Name":
            return self.get_driver.find_element(By.NAME, value)
        elif property == "Xpath":
            return self.get_driver.find_element(By.XPATH, value)
        elif property == "ClassName":
            return self.get_driver.find_element(By.CLASS_NAME, value)
        elif property == "Css":
            return self.get_driver.find_element(By.CSS_SELECTOR, value)
        else:
            raise ValueError

自动化测试设计模式--POM_第3张图片

2.2 页面元素封装类(以百度首页为例)

该类继承BasePage基类,将被测的一个页面所有元素定位都封装在这个类中,并返回所有元素定位的对象。

from Page_Manage_Layer.Base_Page import BasePage

class BaiduPage(BasePage):
    # 继承BasePage页面获取浏览器对象
    
    # 百度首页搜索输入框的元素定位
    def baidu_input_element(self):
        # self.log.info("百度输入框元素定位成功")
        return self.get_element("ID", "kw")

    # 百度首页搜索按钮的元素定位
    def baidu_submit_element(self):
        # self.log.info("百度搜索按钮元素定位成功")
        return self.get_element("ID", "su")

自动化测试设计模式--POM_第4张图片

2.3 百度搜索业务流

该类继承BaiduPage类,主要是定义业务场景流程。

from Page_Manage_Layer.Baidu_Page import BaiduPage

class BaiduFlow(BaiduPage):
    # 完成百度搜索
    def baidu_query(self, content):
        self.baidu_input_element().send_keys(content)
        self.baidu_submit_element().click()

自动化测试设计模式--POM_第5张图片

2.4 百度搜索测试用例

该类继承BaiduFlow类,结合unittest定义测试用例。(parameterized为参数化,将在后面分享的文章中详细介绍自动化测试的参数化)

import time
import unittest
from parameterized import parameterized
from Business_Flow_Layer.Baidu_Flow import BaiduFlow


class BaiduTest(unittest.TestCase, BaiduFlow):
    def setUp(self):
        self.s = BaiduFlow("chrome")
        self.s.open("https://www.baidu.com")

    @parameterized.expand([["测试"], ["开发"], ["产品"]])
    def test_cs1(self, value):
        self.s.baidu(value)
        time.sleep(1)

    def tearDown(self):
        self.s.get_driver.quit()

自动化测试设计模式--POM_第6张图片

至此,简单的一个POM结构案例就完成了。

最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取【保证100%免费】

在这里插 入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

自动化测试设计模式--POM_第7张图片

你可能感兴趣的:(程序员,职场经验,软件测试,设计模式,功能测试,自动化测试,软件测试,职场经验,程序人生,程序员)