基于pytest的主流POM模式——测试框架的设计与实现

news2024/11/16 17:33:42

1、POM设计模式

——页面对象模型(Page object Modules),又名:PO/POM,是UI自动化最佳设计模式之一。把一个页面的测试用例,测试逻辑,封装为一个测试方法或者一个测试类(说白了,就是把如send_keys、click等方法封装一下,方便我们调用,后续不需要每次使用时在每次的写一遍)。

  •  优点:
  1. 测试代码和页面的特定代码(如:定位符、布局)之间有清晰的区分(定位代码、行为代码)
  2. 页面提供的服务或操作只有一个存储库(如:类、py文件),不需要把服务分散到整个测试中,集中进行管理,开发或是测试修改时,只需要修改页面对象就可以了

import pytest
from selenium import webdriver
from time import sleep

class Test_Selenium():
    #环境准备
    @classmethod
    def setup_class(cls):
        cls.driver = webdriver.Chrome()#打开浏览器驱动,这样编写测试的时长会短,测试损耗的资源也会降低

    def test_baidu_case01(self):
        self.driver.get('http://www.baidu.com')
        sleep(1)
        self.driver.find_element_by_id('kw').send_keys('狗狗币')
        self.driver.find_element_by_id('su').click()
        sleep(1)
        assert self.driver.title == "狗狗币_百度搜索" #根据进入的网页title做断言

    def test_baidu_case02(self):
        self.driver.get('http://www.baidu.com')
        sleep(1)
        self.driver.find_element('id','kw').send_keys('selenium')
        self.driver.find_element('id','su').click()
        sleep(6)
        assert self.driver.title == "selenium_百度搜索"  # 根据进入的网页title做断言

    def test_baidu_case03(self):
        self.driver.get('http://www.baidu.com')
        sleep(2)
        self.driver.find_element_by_id('kw').send_keys('pytest')
        self.driver.find_element_by_id('su').click()
        sleep(1)
        assert self.driver.title == "pytest_百度搜索"  # 根据进入的网页title做断言

    #环境清理
    @classmethod
    def teardown_class(cls):
        cls.driver.quit() #退出浏览器

if __name__ == '__main__':
    pytest.main(['-s','test_selenium.py'])

 直接使用selenium的原生代码编写有2个问题:

  1. 测试用例与自动化用例的定位符(如:百度搜索中的kw、su)之间没有分开,如果UI更改了属性值kw、su,所有涉及到这些元素的用例都要改,用例过多时,工作量将会更大
  2. 元素定位代码将在每个测试用例都需要重复的使用,造成代码冗余

——这2个问题,使用到POM就可以解决掉。

2、POM涉及模式的编码实现

目录:

 base.py——基类,封装一些常用的方法

from selenium import webdriver
import pytest
import time

class BasePage:
    """
    基础page层,封装一些常用的方法
    """

    def __init__(self,driver):
        #导入一下webdriver包,方便后边代码的编写
        self.driver = webdriver.Chrome()

    #打开页面
    def open(self,url=None):
        if url is None: #如果url没传参就会走这里,就会默认进入子类中的url
            self.driver.get(self.url)
        else:
            self.driver.get(url)

    #元素定位
    def locator(self,name,value):#可直接使用8种单数形式的定位方法
        return self.driver.find_element(name,value)

    #获取title,就是获取网页标题栏
    def get_title(self):
        return self.driver.title

    #获取页面text,获取页面文本,使用xpath定位
    def get_text(self,path):
        return self.locator("xpath",path).text #获取文本

    #执行JavaScript
    def js(self,script):#脚本作为参数传进来
        self.driver.execute_script(script)

    #休眠时间(等待时间)
    def sleep(self,sec):
        time.sleep(sec)

 baidu_page.py页面对象类:

from base import BasePage

"""
baidu_page.py文件是用来存储百度页面
"""

#创建BaiduPage类继承BasePage
class BaiduPage(BasePage):
    #定义url变量,供父类中的open()方法使用
    url = "http://www.baidu.com"

    #文本定位,并输入关键字
    def search_input(self,search_key):
        #使用父类locator方法来定位元素
        #比原生的selenium更加精简
        self.locator("id","kw").send_keys(search_key)

    #按钮定位,并点击
    def search_button(self):
        self.locator("id","su").click()

test_baidu.py

结果:

============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: C:\Users\11130\PycharmProjects\pythonProject2\demo\data
plugins: forked-1.4.0, html-3.1.1, metadata-1.11.0, rerunfailures-10.2, xdist-2.5.0
collected 3 items

test_baidu.py ...

============================= 3 passed in 11.73s ==============================

——使用这样的方法,我们的代码将大幅度减少冗余,参数更加的便于管理。

 

  总结:

感谢每一个认真阅读我文章的人!!!

 我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

   Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/799302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

语音同声翻译软件让你不再为语言障碍困扰

从前有一个叫黄俊的小伙子,他有一个大梦想:环游世界!但是,他只会说中文,而去到外国又怎么跟当地人交流呢?为了实现自己的梦想,黄俊开始了寻找能帮他解决问题的捷径。这时,方娜向他介…

开源快速开发平台:做好数据管理,实现流程化办公!

做好数据管理,可以提升企业的办公协作效率,实现数字化转型。开源快速开发平台是深受企业喜爱的低代码开发平台,拥有多项典型功能,是可以打造自主可控快速开发平台,实现一对一框架定制的软件平台。在快节奏的社会中&…

工业自动化数据485采集网关支持modbus协议

S475/S475E系列是一种功能丰富的设备,支持多种通信方式和输入输出功能。以下是对其功能的详细介绍: 通信方式: S475/S475E系列支持多种通信方式,包括短信、RS485、语音拨号、GPRS/3G/4G无线数据网络四种告警方式。这意味着用户可…

TCL(Tool Command Language)学习(三)-----文件操作

返回当前文件路径:pwd UNIX 下,会把工作目录变为启动 TCL 脚本的用户的工作目录,WINDOWS 下会把工作目录变为 windows 操作系统的安装目录所在的盘的根目录(如:C:/) 更改当前目录 : cd 返回当前目录下的全部子目录 …

Codeforces Round 888 (Div. 3) A~F

原题链接:Dashboard - Codeforces Round 888 (Div. 3) - Codeforces 目录 A. Escalator Conversations B. Parity Sort C. Tiles Comeback D. Prefix Permutation Sums E. Nastya and Potions F. Lisa and the Martians A. Escalator Conversations 题意&…

2023-07-27:最长可整合子数组的长度, 数组中的数字排序之后,相邻两数的差值是1, 这种数组就叫可整合数组。 给定一个数组,求最长可整合子数组的长度。

2023-07-27:最长可整合子数组的长度, 数组中的数字排序之后,相邻两数的差值是1, 这种数组就叫可整合数组。 给定一个数组,求最长可整合子数组的长度。 答案2023-07-27: 算法maxLen的过程如下&#xff…

Java 队列

基本介绍 数组模拟队列 思路分析 代码实现 import java.util.Scanner;public class Test {public static void main(String[] args) {// 创建一个队列ArrayQueue queue new ArrayQueue(3);int select;Scanner scanner new Scanner(System.in);boolean loop true;while (lo…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块14

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

MySQL基础(四)数据库备份

目录 前言 一、概述 1.数据备份的重要性 2.造成数据丢失的原因 二、备份类型 (一)、物理与逻辑角度 1.物理备份 2.逻辑备份 (二)、数据库备份策略角度 1.完整备份 2.增量备份 三、常见的备份方法 四、备份&#xff08…

“嵌入式开发:多元化就业,职业发展广阔“

嵌入式开发是一个发展迅速、就业前景广阔的领域。在各行各业的电子产品中,嵌入式应用无处不在,为智能化提供关键支持。作为嵌入式工程师,你将有广泛的就业机会。 你可以涉足消费电子、安全安防、汽车电子、医疗电子、电信等多个行业的计算机…

SSIS对SQL Server向Mysql数据转发表数据 (完结)

1、对于根据主键进行更新和插入新的数据,根据前面的文章,对于组件已经很熟悉了,我们直接加入一个 查找 组件 ,如下所示 2、右键点击"查找",然后“编辑” ,选择“连接”,选中我们的目标连接器&…

独立站最全出单营销指南,新手卖家赶紧学起来吧!

这是一个需要投入大量时间和精力的挑战,但只有经过筛选在众多品牌和渠道中找到最适合自己的营销策略,才能成功。 新手商家经常会发现自己有很多可以改进的地方:品牌的颜色、字体以及其他一些细节。但真正走向成熟的商家会意识到,…

cv2抛出异常 “install libgtk2.0-dev and pkg-config, then re-run cmake or configure”

背景: linux中使用cv2显示图片的时候,运行提示异常: 处理方式: 网友的推荐操作: 切换至root模式安装 apt-get install libgtk2.0-dev进入OpenCV下载目录,重新编译 cd /home/XXX/opencv mkdir release …

【图像处理】使用 OpenCV 将您的照片变成卡通

图像到卡通 一、说明 在当今世界,我们被图像和视频所包围。从社交媒体到广告,图像已成为一种强大的交流媒介。但是你有没有想过,如果你能把你的照片变成卡通会发生什么?想象一下,为您最喜欢的照片创建动画版本&#xf…

MOS管可以双向流过电流吗

在大多数MOS管电路中,对于NMOS管,电流方向一般是从漏极到源极,对于PMOS管,电流方向一般是从源极到漏极。 那么MOS管可以反向流过电流吗?也就是NMOS管电流从源极到漏极,PMOS管电流从漏极到源极。 为了弄清这…

【数据结构】实验九:二叉树

实验九 二叉树 一、实验目的与要求 1)理解二叉树的类型定义; 2)掌握二叉树的存储方式及基于存储结构的基本操作实现; 二、 实验内容 1. 二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_…

常见内网穿透工具,收好了!

前言 本文以渗透的视角,总结几种个人常用的内网穿透,内网代理工具,介绍其简单原理和使用方法。 1. nps-npc 1.1 简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协…

解密 CryptBot 窃密软件

CryptBot 是一种针对 Windows 操作系统进行信息窃取的恶意软件,在 2019 年被首次发现。它旨在窃取失陷主机的敏感信息,例如浏览器凭据、加密货币钱包、浏览器 Cookie、信用卡信息与屏幕截图等。 恶意软件简介 沙盒动态分析 样本启动时会创建一个进程&…

什么是SD NAND存储芯片

前言 大家好,我们一般在STM32项目开发中或者在其他嵌入式开发中,经常会用到存储芯片存储数据。今天我和大家来介绍一款存储芯片,我这里采用(雷龙) CS创世 SD NAND 。 SD NAND介绍 什么是SD NAND?它俗称贴…

Linux安装部署Nacos和sentinel

1.将nacos安装包下载到本地后上传到linux中 2.进入nacos的/bin目录,输入命令启动nacos [rootlocalhost bin]# sh startup.sh -m standalone注:使用第二种方式启动,同时增加日志记录的功能 2.2 startup.sh文件是不具备足够的权限,否则不能操作 给文件赋予执行权限 [rootlocalh…