首页 > 其他分享 >UI自动化测试中公认最佳的设计模式-POM

UI自动化测试中公认最佳的设计模式-POM

时间:2024-03-19 13:45:51浏览次数:24  
标签:search self driver POM UI import 设计模式 def 页面

p>什么是POM?

POM是PageObjectModule(页面对象模式)的缩写,其目的是为了Web UI测试创建对象库。在这种模式下,应用涉及的每一个页面应该定义为一个单独的类。类中应该包含此页面上的页面元素对象和处理这些元素对象所需要的方法等。将流程所关联的页面作为对象,将对象串联起来,形成一个个不同的流程,POM是业内公认最佳的设计模式。

POM的优点:

(1)PO提供了页面元素操作和业务流程相分离的模式,可以使测试的代码结构比之前清晰,可读性强。

(2)更方便地复用对象和方法。

(3)对象库是独立于测试用例的、统一的对象库,可以通过集成不同的工具类来达到不同的测试目的。比如集成UnitTest可以用来做单元测试、自动化/功能测试,同时也可以集成JBehave/Cucumber等来做验收测试。

(4)使得整体自动化测试的优点变得更容易一些,如果有某个页面的元素需要变更,那么就可以直接更改封装好的页面元素类即可,而不用更改调用它的其他测试类/代码。这样整个的代码维护成本也会缩减。

PO的核心就是分层思想,把同属于一个页面的元素都放在一个页面类中。

以上概念内容来源于某书籍

二、简要结构设计

  1. 逻辑代码:基类,实现所有工具函数封装,类似于关键字驱动设计模式;

  2. 页面对象代码:基于系统页面,通过调用工具函数来实现业务的操作,生成对应的页面对象;

  3. 测试代码:基于测试需要,组件页面对象,实现核心流程的自动化,执行测试用例;

  4. 测试数据:为测试用例的执行提供所需要的测试数据。

三、POM完整框架

  1. Base层:定义项目需要的基础方法,特别是一些基础操作,如元素click操作、sendkeys操作,调用JavaScript脚本的方法和其他一些与基本浏览器相关的操作。

  2. Common层:包含处理Excel文件的方法,获取项目路径、测试系统URL的信息和框架执行相关日志功能的实现方法。

  3. Data层:存放测试数据,在这里可以维护测试数据,这样存放是为了让项目的可维护性强、整体的条理性强。测试数据有时是自动化测试的驱动因素,因此对Data的管理和维护就显的特别重要。

  4. Logs层:存放项目在运行过程中产生的日志文件。

  5. PageObject层:这里是PO的核心层,该层不但涉及代码技术,还涉及对项目业务的分析,进而对项目的页面进行分析。

  6. Reports层:存放项目执行过程中产生的测试报告文件,测试报告是对测试结果的总结。

  7. TestCase层:管理测试用例和执行测试,相当于测试的总入口。

  8. config.ini:整个项目需要用到的配置项。

四、项目实战

以百度搜索为例

  1. 我们首先新建一个简单的项目结构:base、data、page_object、cases,如下图所示:

image.png 2. 在base包下新建一个base_page.py文件,在base_page.py文件下新建一个BasePage类作为基类,提供各个常用的已封装好的函数,便于后续的页面对象类进行调用。selenium中常用的函数:元素定位、输入、点击、访问URL、等待、关闭等。代码如下:

'''
基类:提供各个常用的已封装好的函数,便于后续的页面对象类进行调用。
selenium中常用的函数:元素定位、输入、点击、访问URL、等待、关闭
'''
from time import sleep
from selenium import webdriver

class BasePage:

    driver = webdriver.Chrome()

    # 访问URL
    def visit(self, url):
        self.driver.get(url)

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

    # 输入
    def input(self, loc, txt):
        self.locator(loc).send_keys(txt)

    # 点击
    def click(self, loc):
        self.locator(loc).click()

    # 等待
    def wait(self, time):
        sleep(time)

    # 关闭
    def close(self):
        self.driver.quit()
  1. page_object包下新建一个search_page.py文件,在该文件下新建一个SearchPage类继承BasePage类,调用基础类中的方法实现页面操作,生成对应的页面对象。代码如下:
'''
百度查询页面,搜索功能
'''
from selenium.webdriver.common.by import By
from base.base_page import BasePage
from selenium import webdriver

class SearchPage(BasePage):

    url = 'http://www.baidu.com'

    # 定位百度输入框
    search_input = (By.NAME, 'wd')
    # 定位百度一下按钮
    search_button = (By.ID, 'su')

    # 封装实现业务流程的函数
    def search(self, txt):
        self.visit(self.url)
        self.wait(2)
        self.input(self.search_input, txt)
        self.wait(2)
        self.click(self.search_button)
  1. cases包下新建一个testcase.py文件作为测试类,实现在百度中分别搜索selenium、python,代码如下:
'''
测试类
'''
import unittest
from page_object.search_page import SearchPage
from selenium import webdriver

class Case(unittest.TestCase):

    def test_search1(self):
        driver = webdriver.Chrome()
        txt = 'selenium'
        SearchPage(driver).search(txt)
        
    def test_search2(self):
        driver = webdriver.Chrome()
        txt = 'python'
        SearchPage(driver).search(txt)

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

运行以上代码发现,因为创建了两次webdriver,所以每运行一次代码都会打开一个Chrome浏览器,同时,代码中也存在冗余。优化方案:可以增加@classmethod作为前置条件和后置条件,搜索的条件也可以采用数据驱动的方式完成,提高代码的可读性与维护性。

data包下新建一个searchTXT.yaml文件,存放搜索的内容如下:

image.png

优化之后代码如下:

'''
测试类
'''
import unittest
from page_object.search_page import SearchPage
from selenium import webdriver
import ddt

@ddt.ddt()
class Case(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        cls.driver = webdriver.Chrome()
        cls.se = SearchPage(cls.driver)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    @ddt.file_data('../data/searchTXT.yaml')
    def test_search(self, txt):
        self.se.search(txt)

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

运行以上代码,发现测试用例执行了四次,分别搜索了selenium、python、java、php,如此实现了数据驱动,同时也在一个浏览器中完成了操作。

五、后记

以上简单的实现了POM的设计模式,完成了基类、页面对象层、数据层、测试层的代码编写,若读者有兴趣,可以完成报告层、日志层等内容的编写,最终实现完整的框架。

标签:search,self,driver,POM,UI,import,设计模式,def,页面
From: https://www.cnblogs.com/R-bear/p/18082584

相关文章

  • 设计模式(行为型设计模式——职责链模式)
    设计模式(行为型设计模式——职责链模式)职责链模式基本定义为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。在这里客户端和处理者都没有......
  • 【渗透工具】BurpSuite汉化无cmd框版安装教程
    【本文仅记录个人安装过程,教程来自:https://www.52pojie.cn/thread-1544866-1-1.html】安装链接123网盘(不限速需登录免客户端)https://www.123pan.com/s/F2W5Vv-Rk7Vv.html提取码:52pj安装步骤选择所需安装的版本:笔者下载2022.11版本并解压:双击运行文件夹中的清......
  • 【渗透工具】Chrome配置BurpSuite代理教程
    工具安装教程【渗透工具】BurpSuite汉化无cmd框版安装教程配置代理教程1、配置Burp代理为127.0.0.1:80802、扩展商店添加插件switchyomega,修改服务器和端口为下图:3、打开代理,选择刚才添加的代理4、访问http://burp/,获取证书:5、将证书添加到Chrome浏览器:至此......
  • Linux安装和运行Pomelo
    1.安装启动pomelo1.在data目录下创建文件夹node和server,将服务器代码上传到server下2.进入node目录cd/data/node3.下载wgethttps://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz4.解压tar-xfnode-v10.16.3-linux-x64.tar.xz5.进入cdnode-v10.16.3-lin......
  • UI自动化关键字驱动的简单设计思路
    步骤一:定义关键字首先,我们定义一些与登录功能相关的关键字,如:打开页面:用于打开指定的Web页面。输入文本:用于在输入框中输入文本。点击按钮:用于模拟点击按钮的动作。验证文本:用于验证页面上是否显示指定的文本。步骤二:设计测试用例接下来,我们设计一个登录功能的测试用例。这......
  • 自动化测试框架、Python面向对象以及POM设计模型简介
    1 自动化测试框架概述   所谓的框架其实就是一个解决问题的思维,前言中描述的诸多问题如果得到解决,自然而然这种得到良好解决的东西它就可以称之为一个框架,只是这个框架用来解决如何组织开展自动化测试。一个典型的自动化测试框架一般包括测试用例集模块、测试执行控制模块......
  • vue2结合element UI组件库封装的搜索组件
    可以根据不同的搜索条件自动排版,分为一个搜索条件,2-4个搜索条件,大于5的搜索条件具体样例见下方 封装的组件库:el-seacher.vue<template> <divv-if="!isModalSearch"class="searchFormborder-basic":class="isHeaderSearch?'headerBack':'whiteBtnBgd'&q......
  • NodeJS 中的设计模式
    Node.js是一个流行的JavaScript运行时,允许开发者使用事件驱动、非阻塞I/O模型构建可扩展的网络应用程序。和任何复杂的框架一样,Node.js应用程序可以从使用成熟的设计模式中受益,以促进代码重用、可维护性和健壮性。本文将概述一些对Node.js开发非常有用的设计模式。......
  • [Paper Reading] GLIDE: Towards Photorealistic Image Generation and Editing with
    GLIDE:TowardsPhotorealisticImageGenerationandEditingwithText-GuidedDiffusionModelsGLIDE(GuidedLanguagetoImageDiffusionforGenerationandEditing)时间:22/03机构:OpenAITL;DR本文研究使用DiffusionModel做图像生成过程,如何更好地加入conditional信息......
  • 设计模式学习(一)单例模式的几种实现方式
    目录前言饿汉式懒汉式懒汉式DCLP局部静态式(Meyers'Singleton)单例模板参考文章前言单例模式,其核心目标是确保在程序运行的过程中,有且只有存在一个实例才能保证他们的逻辑正确性以及良好的效率。因此单例模式的实现思路就是确保一个类有且只有一个实例,并提供一个该实例的全局访问......