Web自动化测试,怎样参数化?

2023-10-27

目录

1.读取 csv 文件

2.数据ddt参数化

2.1实施步骤

2.2代码举例(unittest框架)

3.PO 模式

3.1介绍

3.2非po模式和po模式对比

3.3Po分层及彼此关系

3.4代码举例(非PO模式)

3.5代码举例(PO模式)

3.5.1基础层BasePage

3.5.2PO层

3.5.3测试用例层

1.读取 csv 文件

#通常文件csv
1.找到文件
url_path = os.path.join(os.path.dirname(__file__), "..", "..", "data", file_name)
2.打开这个文件
with open(url_path, "r", encoding="utf8") as file_data
3.读取这个文件中的内容:csv库
file_value = csv.reader(file_data)
4.把读取到的内容转换成python中的列表 
list_file = list(file_value)[line]
5.把读取到的内容返回出去(按行返回,1行就表示1个用例) 
return list_file
#当文件是配置文件时,第四步需要把数据转化成字典
4.把读取到的内容变成字典
dict_file = dict(file_value)
5.返回这个字典信息,所有一起返回
return list_file

2.数据ddt参数化

2.1实施步骤

  1. 创建测试数据
  2. 封装读取数据的方法,保留测试脚本调用的接口/属性(需要传递给脚本什么参数)
  3. 编写自动化测试脚本
  4. 脚本中调用封装好的处理数据文件的模块并引入测试数据
  5. 执行测试脚本并分析测试结果

2.2代码举例(unittest框架)

import unittest
import ddt
from openpyxl import load_workbook
from selenium import webdriver

def Excelread():
    driver= load_workbook('sanmu.xlsx')
    sheet = driver['登录']
    rows = sheet.max_row
    usernamelist = []
    #取出表格中有用的数据信息
    for one in range(2, rows+1):
        #取出姓名
        name = sheet.cell(one, 2).value
        password = sheet.cell(one, 3).value
        usernamelist.append([name, password])
    driver.close()
    return usernamelist

@ddt.ddt
class Logincases(unittest.TestCase):
    a = 5
    b = 2
    @classmethod
    def setUpClass(cls) -> None:
    #数据可以是元祖,列表,字典
    value = Excelread()
    #装饰器@ddt.data是用来将value拆成['姓名数据', '密码数据']
    @ddt.data(*value)
    #unpack则是将['姓名数据', '密码数据']两个元素分别赋值传入给uname和passwd
    @ddt.unpack
    def test_login(self, uname, passwd):
        self.driver = webdriver.Chrome()
        self.driver.get('登录网站')
        self.driver.implicitly_wait(15)
        self.driver.find_element_by_name('userName').send_keys(uname)
        self.driver.find_element_by_name('userPass').send_keys(passwd)
        self.driver.find_element_by_css_selector('button[οnclick="login();"]').click()
    @classmethod
    def tearDownClass(cls) -> None:
        self.driver.quit()

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

3.PO 模式

3.1介绍

    PO模式:Page Object,是一种页面对象设计模式,算是一种比较好的设计模式。在该设计模式中,功能类(PageObjects)所代表的是每个页面之间的逻辑关系。核心思想是分层,实现松耦合,脚本重用,脚本易维护。

3.2非po模式和po模式对比

非PO模式 PO模式
面向过程的线性脚本 POM把页面元素定位和业务操作流程分开。实现松耦合。
复用性差 UI元素的改变不需要修改业务逻辑代码。只需要找到对应的PO页修改定位即可,数据代码分离
维护性差 PO能使我们的测试代码提高代码的可读性,高复用性,可维护性。

3.3Po分层及彼此关系

  1. 基础层BasePage:封装一些最基础的selenium的原生的api方法,元素定位,框架跳转等。
  2. PO层:元素定位、获得元素对象,页面动作
  3. 测试用例层:业务逻辑,数据驱动
  4. 三者关系:PO层继承基础层,测试用例层调用PO层。

3.4代码举例(非PO模式)

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

class PracTesting( unittest.TestCase ):

    @classmethod
    def setUpClass(cls) -> None:
        # 打开浏览器
        cls.driver = webdriver.Chrome()
        # 加载百度首页
        cls.driver.get( 'http://www.baidu.com' )
        cls.driver.fullscreen_window()
    def test01(self):
        self.driver.implicitly_wait(5)
        # 在百度搜索栏中输入软件测试
        self.driver.find_element( By.ID, 'kw' ).send_keys( '软件测试' )
        # 点击百度一下按钮
        self.driver.find_element( By.ID, 'su' ).click()
    def test02(self):
        time.sleep(2)
        #返回搜索页面
        self.driver.back()
        time.sleep(2)
        # 在百度搜索栏中输入接口测试
        self.driver.find_element( By.ID, 'kw' ).send_keys( '接口测试' )
        # 点击百度一下按钮
        self.driver.find_element( By.ID, 'su' ).click()

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


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

3.5代码举例(PO模式)

3.5.1基础层BasePage

from selenium import webdriver

class BasePage:
    #构造方法
    def __init__(self):
        # 打开浏览器
        self.driver = webdriver.Chrome() 
        # 加载百度首页
        self.driver.get('http://www.baidu.com')

    #封装定位元素
    def find_ele(self,*args):
        ele = self.driver.find_element(*args)
        return ele

3.5.2PO层

from selenium.webdriver.common.by import By
from base.base_page import BasePage

class BaiduPage(BasePage):
    #元素定位,
    baidu_text_loc = (By.ID, 'kw')
    baidu_submit_loc = (By.ID, 'su')
    #获得元素对象,
    def get_text_obj(self):
        ele = self.find_ele(*BaiduPage.baidu_text_loc)
        return ele
    def get_submit_obj(self):
        ele = self.find_ele(*BaiduPage.baidu_submit_loc)
        return ele
    #页面操作
    def search(self,search_string):
        self.get_text_obj().send_keys(search_string)
        self.get_submit_obj().click()

3.5.3测试用例层

from ddt import ddt, data
from po.baidu_page import BaiduPage

@ddt
class BaiduTest(unittest.TestCase):

    @data('软件测试','接口测试')
    def test01(self,seaString):
        BaiduPage().search(seaString)
        time.sleep(5)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web自动化测试,怎样参数化? 的相关文章

  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • 如何使用pycaffe重构caffe网络

    我想要的是 加载网络后 我将分解一些特定的图层并保存新的网络 例如 原网 数据 gt conv1 gt conv2 gt fc1 gt fc2 gt softmax New net 数据 gt conv1 1 gt conv1 2 gt c
  • 使用 Django 的 post_save() 信号

    我有两张桌子 class Advertisement models Model created at models DateTimeField auto now add True author email models EmailField
  • 类属性在功能上依赖于其他类属性

    我正在尝试使用静态类属性来定义另一个静态类属性 我认为可以通过以下代码来实现 f lambda s s 1 class A foo foo bar f A foo 然而 这导致NameError name A is not defined
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • 在 python-docx 中搜索和替换

    我有一个包含以下字符串的文档 模板 你好 我的名字是鲍勃 鲍勃是一个很好的名字 我想使用 python docx 打开此文档并使用 查找和替换 方法 如果存在 来更改每个字符串 Bob gt Mark 最后 我想生成一个新文档 其中包含字符
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 如何使用 openpyxl 对工作簿中的 Excel 工作表/选项卡进行排序

    我需要按字母数字对工作簿中的选项卡 工作表进行排序 我在用openpyxl https openpyxl readthedocs io en default 操作工作表 您可以尝试排序workbook sheets list workboo
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html

随机推荐

  • Openwrt开发笔记(1)—— 开发环境

    OpenWrt简介 OpenWrt 是一个嵌入式设备的 Linux 发行版 以 GPL 许可协议发行 其主要特点有如下几个 代码里不含第三方开源包 只包含开源包地址链接 在编译的时候下载 编译时自动下载源代码 打补丁来满足指定平台要求 并编
  • Oracle生成不重复字符串 sys_guid()

    在oracle8i以后提供了一个生成不重复的数据的一个函数sys guid 一共32位 生成的依据主要是时间和机器码 具有世界唯一性 类似于java中的UUID 都是世界唯一的 其优点就是生成的字符串是唯一的 但其和UUID有同样的弊端 生
  • 论文笔记:FILLING THE G AP S: MULTIVARIATE TIME SERIES IMPUTATION BY GRAPH NEURAL NETWORKS

    0 abstract introduction 之前的补全方法并不能很好地捕获 利用 不同sensor之间的非线性时间 空间依赖关系 高效的时间序列补全方法 不仅应该考虑过去 或者未来 的数值 还应该同时考虑空间上邻近的点的测量值 这里的空
  • 抖音超火的网页表白代码大全(浪漫的html表白源代码)

    精彩专栏推荐 作者主页 进入主页 获取更多源码 web前端期末大作业 HTML5网页期末作业 1000套 程序员有趣的告白方式 HTML七夕情人节表白网页制作 125套 七夕来袭 是时候展现专属于程序员的浪漫了 你打算怎么给心爱的人表达爱意
  • 姿态分析开源工具箱MMPose使用示例:人体姿势估计

    MMPose的介绍及安装参考 https blog csdn net fengbingchun article details 126676309 这里给出人体姿势估计的测试代码 论文 Deep high resolution repres
  • UI自动化测试-selenium元素定位

    在使用Selenium和WebDriver进行UI自动化测试时 我们首先需要对元素定位 那么如何来定位元素呢 HTML 在进行元素定位之前 我们要对html代码有所了解 div class s form div class s form w
  • 【CUDA学习】__syncthreads的理解

    syncthreads 是cuda的内建函数 用于块内线程通信 syncthreads is you garden variety thread barrier Any thread reaching the barrier waits u
  • BUUCTF学习笔记-Secret File

    BUUCTF学习笔记 Secret File 时间 2020 09 28 考点 文件包含 打开页面没发现特别的内容 右键查看源代码才发现下面隐藏了一个a标签只是字体颜色改成了和背景色一样 标签跳转到另外一个页面Archive room ph
  • C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历

    DFS的核心思想在于对访问的邻接节点进行递归调用 BFS的核心思想在于建立了一个邻接节点的队列 在Dev C 中调试运行通过 用下图进行了测试 include
  • Python里面的[::-1]和[::2]是什么意思

    Python里面的 1 和 2 是什么意思 来源 https docs python org 2 3 whatsnew section slices html L range 10 L 2 0 2 4 6 8 L 1 9 8 7 6 5 4
  • 使用Vue+xlsx+xlsx-style实现导出自定义样式的Excel文件

    本文就是上一篇 使用Python openpyxl实现导出自定义样式的Excel文件 文章中提到的 之前项目的导出Excel文件操作都是在前端完成的 这段话中基于前端实现的导出Excel文件方法 文档地址 https docs sheetj
  • python中circle函数的用法,python画圆运用了什么函数

    python画圆运用了matplotlb库的figure 和Circle 函数 其中 figure 函数用于确定画布大小 而Circle 函数用于配置圆的相关信息 进而画圆 本教程操作环境 windows7系统 Python3版 Dell
  • MySQL多表操作练习题

    数据准备 CREATE table dept deptno INT PRIMARY KEY dname VARCHAR 14 loc VARCHAR 13 INSERT INTO dept VALUES 10 accounting new
  • QT开发(十九)——QT内存泄漏问题

    QT开发 十九 QT内存泄漏问题 一 QT对象间的父子关系 QT最基础和核心的类是 QObject QObject内部有一个list 会保存children 还有一个指针保存parent 当自己析构时 会自己从parent列表中删除并且析构
  • Java 反射 与 主要API

    控制你的大脑 控制你的行为 你会得到更多 收获很多 文章目录 一 反射相关的主要API 二 代码例子演示 三 反射测试类 一 反射相关的主要API API 名称 代表含义 Java lang class 代表一个类 java lang re
  • J-Tech Talk | 6.29首播 Python文档漫谈

    J Tech Talk 由 Jina AI 社区为大家带来的技术分享 围绕 Python 人工智能 深度学习等 给大家带来针对具体实战型问题的讲解 分享 Jina AI 在开发过程中所积累的经验 Github 的开源项目数不胜数 想要扩大项
  • 使用OPENLDAP C API修改 win2003 AD域(Active Directory)用户密码

    参考 http blog csdn net wzhwho article details 6209693 参考 http www 121 name LDAP html 参考 http pig made it com pig adusers
  • 单片机学习笔记1:单片机简介

    单片机 1 什么是单片机 单片机 Single Chip Microcomputer 是一种集成电路芯片 是采用超大规模集成电路技术把具有数据处理能力的中央处理器 CPU 存储器 RAM ROM 中断系统 I O接口电路 定时器 计数器等功
  • 图像分类(1),数据预处理

    本文介绍如何使用pytorh利用预训练模型进行图像分类 主要参考Transfer Learning Tutorial和 具体代码可以参考Image classification 下载代码文件 git clone https github c
  • Web自动化测试,怎样参数化?

    目录 1 读取 csv 文件 2 数据ddt参数化 2 1实施步骤 2 2代码举例 unittest框架 3 PO 模式 3 1介绍 3 2非po模式和po模式对比 3 3Po分层及彼此关系 3 4代码举例 非PO模式 3 5代码举例 PO