Pytest 读取excel文件参数化应用

本文是基于Pytest框架,读取excel中的文件,传入页面表单中,并做相应的断言实现。

1、编辑媒体需求

首先明确一下需求,我们需要对媒体的表单数据进行编辑,步骤如下:

具体表单如下图所示

1、登录

2、点击我的媒体

3、点击媒体

4、点击编辑媒体

5、设置标题

6、设置媒体标题分类

7、设置标签001

8、设置产生日期

9、上传图片

10、描述

11、状态

12、启动评论

13、缩略图时刻

14、允许下载

然后点击"Update Media"后,就会跳转到这个媒体的界面上。可以查看提交的配置是否生效。

2、编辑媒体V1.0

第一版先定位到元素并手工实现。

2.1 登录

2.1.1  conftest.py配置

首先在conftest.py做好公共方法的配置工作,也就是登录退出等一些常用的方法。

conftest.配置特点

conftest.py配置脚本名称是固定的,不能改名称

conftest.py与运行的用例要在同一个package下,并且有————init__.py文件

测试用例文件不需要import conftest.py就能自动找到配置好的@pytest.fixture

import time

import pytest
from selenium import webdriver


@pytest.fixture(scope='session')
def driver():
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(10)
    yield driver
    time.sleep(10)   # 如果需要观察程序运行过程,那么加时间等待;代码调试弯沉后,去掉时间等待。
    # driver.quit()

@pytest.fixture(scope='session')
def login(driver):
    driver.get("https://svr-6-9010.share.51env.net/accounts/login/")
    # 3、输入用户名
    driver.find_element_by_id("id_login").send_keys("changcheng1211")
    # 4、输入密码
    driver.find_element_by_id("id_password").send_keys("changcheng1211")
    driver.find_element_by_id("id_captcha_1").send_keys("changcheng1211")
    # 5、点击登录
    driver.find_element_by_class_name("primaryAction").submit()
    yield driver

介绍一下

Pytest Fixture

作用

为每个测试用例完成一些公共的前置或者后置工作

限制范围

scope="function"每个方法调用一次

scope="class"每个类调用一次

scope="module"每一个.py文件调用一次

scope="session"多个.py文件只调用一次

用法

import pytest

打开浏览器  def driver():

登录功能   def login():

2.1.12 pytest之全局配置文件pytest.ini

[pytest]
addopts = -s -v
testpaths = test_cases/test_update_media.py

-s:表示输出调试信息,用于显示测试函数中print()打印的信息

-v:未加前只打印模块名,加v后打印类名、模块名、方法名,显示更详细的信息

-q:表示只显示整体测试结果

-vs:这两个参数可以一起使用

-n:支持多线程或者分布式运行测试用例(前提需安装:pytest-xdist插件)

–html:生成html的测试报告(前提需安装:pytest-html插件) 如:pytest -vs --html ./reports/result.html

testpaths 是指定执行的路径的。

2.2  编辑媒体test_update_media.py

首先在测试的目录下新建一个测试文件test_update_media.py,D:\python\autoFuncTest2\test_cases\test_update_media.py

from selenium.webdriver.support.select import Select


class TestUpDateMedia:
    def test_update_meida(self,login):
        # 1、登录
        # 2、点击我的媒体
        login.find_element_by_partial_link_text('我的媒体').click()
        # 3、点击媒体
        login.find_element_by_class_name('item-thumb').click()
        # 4、点击编辑媒体
        login.find_element_by_link_text('编辑媒体').click()
        # 5、设置标题
        login.find_element_by_id('id_title').clear()
        login.find_element_by_id('id_title').send_keys('小猴子.MP4')
        # 6、设置媒体标题分类
        id_category = login.find_element_by_id('id_category')
        # 如果用ctrl键,可以多选,用click()方法不能多选。
        # Selenium给我们提供了一种方法 select_by_visible_text('Film')  可以多选
        select_category = Select(id_category)
        select_category.select_by_visible_text('Film')
        select_category.select_by_index(0)  # Art
        select_category.select_by_value('2') # Documentary
        # 7、设置标签001
        id_new_tags = login.find_element_by_id('id_new_tags')
        id_new_tags.clear()
        id_new_tags.send_keys('001')
        # 8、设置产生日期
        id_add_date = login.find_element_by_id('id_add_date')
        id_add_date.clear()
        id_add_date.send_keys('2000/06/04 20:49')
        # 9、上传图片
        login.find_element_by_id('id_uploaded_poster').send_keys('D:\\niupeng2.png')
        # 10、描述
        id_description = login.find_element_by_id('id_description')
        id_description.clear()
        id_description.send_keys('今天我们去动物园,参观了小猴子')
        # 11、状态
        id_state = login.find_element_by_id('id_state')
        Select(id_state).select_by_visible_text('私有')
        # 12、启动评论
        login.find_element_by_id('id_enable_comments').click()
        # 13、缩略图时刻
        id_thumbnail_time = login.find_element_by_id('id_thumbnail_time')
        id_thumbnail_time.clear()
        id_thumbnail_time.send_keys('50')
        # 14、允许下载
        login.find_element_by_id('id_allow_download').click()
        # 15、点击Update Media
        login.find_element_by_class_name('primaryAction').submit()


下面介绍一下代码的实现

from selenium.webdriver.support.select import Select


class TestUpDateMedia:
    def test_update_meida(self,login):

首先导入一个Select的包,因为里面有用到下拉框选择。

新建一个class TestUpDateMedia  的类。

def test_update_meida(self,login):    

并在里面声明一个‘test_update_meida’的方法,它继承自conftest.py的login的类。这里是直接调用登录功能。

        # 2、点击我的媒体
        login.find_element_by_partial_link_text('我的媒体').click()
        # 3、点击媒体
        login.find_element_by_class_name('item-thumb').click()
        # 4、点击编辑媒体
        login.find_element_by_link_text('编辑媒体').click()

先点我的媒体,点击媒体,再点击编辑媒体

        # 5、设置标题
        login.find_element_by_id('id_title').clear()
        login.find_element_by_id('id_title').send_keys('小猴子.MP4')

设置标题前应先清空输入框

        # 6、设置媒体标题分类
        id_category = login.find_element_by_id('id_category')
        # 如果用ctrl键,可以多选,用click()方法不能多选。
        # Selenium给我们提供了一种方法 select_by_visible_text('Film')  可以多选
        select_category = Select(id_category)
        select_category.select_by_visible_text('Film')
        select_category.select_by_index(0)  # Art
        select_category.select_by_value('2') # Documentary

设置媒体的标题分类

这里涉及到下拉框的操作

下拉框操作
    假设有一个元素使select标签,这时需要选择其中一个/多个选项
    这时就不是click或者sendKeys这样的操作,而是应该使用”选择“操作
    代码实现步骤
        1.首先定位下拉框
            WebElement element = driver.findElement(By...)
        2.把定位到的元素转成下拉框类型
            Select select = new Select(element);
        3、执行”选择“操作
            select.deselectAll()
                清空选择
            选择某个元素,有三种方式
                select.select_by_visible_text('界面可见的文字')
                select.select_by_index(0) #选项的value属性
                select.select_by_value('2')  #第几个选项

        # 7、设置标签001
        id_new_tags = login.find_element_by_id('id_new_tags')
        id_new_tags.clear()
        id_new_tags.send_keys('001')
        # 8、设置产生日期
        id_add_date = login.find_element_by_id('id_add_date')
        id_add_date.clear()
        id_add_date.send_keys('2000/06/04 20:49')

设置标签和产生日期。

        # 9、上传图片
        login.find_element_by_id('id_uploaded_poster').send_keys('D:\\niupeng2.png')
        # 10、描述
        id_description = login.find_element_by_id('id_description')
        id_description.clear()
        id_description.send_keys('今天我们去动物园,参观了小猴子')
        # 11、状态
        id_state = login.find_element_by_id('id_state')
        Select(id_state).select_by_visible_text('私有')

正常定位元素并发送值就可以。

        # 12、启动评论
        login.find_element_by_id('id_enable_comments').click()
        # 13、缩略图时刻
        id_thumbnail_time = login.find_element_by_id('id_thumbnail_time')
        id_thumbnail_time.clear()
        id_thumbnail_time.send_keys('50')
        # 14、允许下载
        login.find_element_by_id('id_allow_download').click()
        # 15、点击Update Media
        login.find_element_by_class_name('primaryAction').submit()

到这后,第一版已经完成了。已经实现了基本的功能。

在命令行界面输入pytest,会显示执行完成。

3、编辑媒体V2.0

简要说明一下代码的结构。首先新建了一个叫autoFuncTest2的工程。里面按顺序resource下面有test_data.xlsx的测试数据文件。test_cases下面的conftest.py的配置文件和test_update_media2.py的测试用例文件,utils里面有一个专门读取xlsx文件的excel_utils.py文件。最后是一个pytest.ini的全局配置文件。

执行顺序为,首先命令行,输入pytest,会读取pytest.ini配置文件,按照里面的路径执行测试test_cases下面的测试用例test_update_media2.py。test_update_media2.py再调用conftest.py进行登录,登录完成后调用utils里面有一个专门读取xlsx文件的excel_utils.py文件,读取resource下面有test_data.xlsx的测试数据文件,进行操做。

3.1 pytest之全局配置文件pytest.ini

把代码的执行路径改了。因为我们要重新编写V2.0版本。我们要将待执行的命令指向要执行的文件。

[pytest]
addopts = -s -v
testpaths = test_cases/test_update_media2.py

3.2 测试数据文件test_data.xlsx

这个是要读取的excel文件

其中,里面有一些参数,是我们要读取的。

title, category, tag, date, image, description, state, enable_comments, thumbnail_time, allow_download,verify_state, verify_date, verify_enable_comments,verify_allow_download

3.3 test_update_media2.py

这个要从excel里面读取数据,进行参数化。

import time

import pytest
from selenium.webdriver.support.select import Select

from utils import excel_utils


class TestUpDateMedia:
    test_data = excel_utils.read(__file__)
    @pytest.mark.parametrize('title, category, tag, date, image, description, state,'
                             ' enable_comments, thumbnail_time, allow_download,'
                             ' verify_state, verify_date, verify_enable_comments,'
                             ' verify_allow_download', test_data)
    def test_update_media(self,login,title, category, tag, date, image, description,
                          state, enable_comments, thumbnail_time, allow_download,
                          verify_state, verify_date, verify_enable_comments,
                          verify_allow_download):
        # 1、登录
        # 2、点击我的媒体
        if 'Media was edited!' in login.page_source:
            login.find_element_by_xpath('//i[text()="menu"]').click()
        # 如果页面出现了'Media was edited!',那么需要先点击左上角的”i“标签,三个横线的按钮
        login.find_element_by_partial_link_text('我的媒体').click()
        # except Exception as e:
        #     login.find_element_by_xpath('//i[text()="menu"]').click()

        # 3、点击媒体
        login.find_element_by_class_name('item-thumb').click()
        # 4、点击编辑媒体
        login.find_element_by_link_text('编辑媒体').click()
        # 5、设置标题
        login.find_element_by_id('id_title').clear()
        login.find_element_by_id('id_title').send_keys(title)
        # 6、设置媒体标题分类
        id_category = login.find_element_by_id('id_category')
        # 如果用ctrl键,可以多选,用click()方法不能多选。
        # Selenium给我们提供了一种方法 select_by_visible_text('Film')  可以多选
        select_category = Select(id_category)
        select_category.deselect_all()
        for c in category.split(','):
            select_category.select_by_visible_text(c)
        # select_category.select_by_index(0)  # Art
        # select_category.select_by_value('2') # Documentary
        # Experimental,Music,TV
        # 7、设置标签001
        id_new_tags = login.find_element_by_id('id_new_tags')
        id_new_tags.clear()
        id_new_tags.send_keys()
        # 8、设置产生日期
        id_add_date = login.find_element_by_id('id_add_date')
        id_add_date.clear()
        id_add_date.send_keys(date)
        # 9、上传图片
        login.find_element_by_id('id_uploaded_poster').send_keys(image)
        # 10、描述
        id_description = login.find_element_by_id('id_description')
        id_description.clear()
        id_description.send_keys(description)
        # 11、状态
        id_state = login.find_element_by_id('id_state')
        Select(id_state).select_by_visible_text(state)
        # 12、启动评论
        id_enable_comments = login.find_element_by_id('id_enable_comments')
        if enable_comments == '启用评论' and id_enable_comments.is_selected():
            pass
        elif enable_comments == '不启用评论' and  not id_enable_comments.is_selected():
            pass
        else:
            id_enable_comments.click()

        # 13、缩略图时刻
        id_thumbnail_time = login.find_element_by_id('id_thumbnail_time')
        id_thumbnail_time.clear()
        id_thumbnail_time.send_keys(thumbnail_time)
        # 14、不允许下载                            allow_download,
        id_allow_download = login.find_element_by_id('id_allow_download')
        if allow_download == '允许下载' and id_allow_download.is_selected():
            pass
        elif allow_download == '不允许下载' and not id_allow_download.is_selected():
            pass
        else:
            id_allow_download.click()

        # 15、点击Update Media
        login.find_element_by_class_name('primaryAction').submit()
        # 16.断言
        # 检查标题
        assert login.find_element_by_css_selector('.media-title-banner h1').text == title
        # 检查分类
        for c in category.split(','):
            assert c in login.page_source

        # 检查标签
        assert tag in login.page_source
        # 检查日期
        assert verify_date in login.page_source
        # 检查描述
        assert description in login.page_source
        # 检查状态
        if state == '公开':
            assert 'private' not in login.page_source
            assert 'unlisted' not in login.page_source
        else:
            assert verify_state in login.page_source
        # 检查评论
        assert verify_enable_comments in login.page_source
        # 检查是否允许评论  form-textarea
        if 'Add a comment...' == verify_enable_comments:
            assert login.find_element_by_class_name('form-textarea').get_attribute('placeholder') == 'Add a comment...'
        else:
            assert verify_enable_comments in login.page_source
        # 检查是否允许下载
        if verify_allow_download == '允许下载':
            # login.find_element_by_xpath('//span[text()="下载"]')
            assert '下载' in login.page_source
        else:
            assert '下载' not in login.page_source

下面解释一下

@pytest.mark.parametrize('excel中的标题',test_data)

接下来将这些参数传进去。并将里面的响应参数替换成传进去的参数。

def test_update_media(self,login,title, category, tag, date, image, description,
                      state, enable_comments, thumbnail_time, allow_download,
                      verify_state, verify_date, verify_enable_comments,
                      verify_allow_download):

有时隐式等待一些元素需要用一些条件触发,可以用一些条件判断代替。

if 'Media was edited!' in login.page_source:
    login.find_element_by_xpath('//i[text()="menu"]').click()

有时一个参数里面有多个值,比如category里面有Experimental,Music,TV,下拉框里面需要选多个值,需要用for循环遍历,并用逗号隔开他们。

        # 6、设置媒体标题分类
        id_category = login.find_element_by_id('id_category')
        # 如果用ctrl键,可以多选,用click()方法不能多选。
        # Selenium给我们提供了一种方法 select_by_visible_text('Film')  可以多选
        select_category = Select(id_category)
        select_category.deselect_all()
        for c in category.split(','):
            select_category.select_by_visible_text(c)

有时需要判断同时页面上是否勾选,如果勾选,并且excel中要求启用评论,那么不操作,反之就勾选。这里面涉及到一个多重判断。

        # 12、启动评论
        id_enable_comments = login.find_element_by_id('id_enable_comments')
        if enable_comments == '启用评论' and id_enable_comments.is_selected():
            pass
        elif enable_comments == '不启用评论' and  not id_enable_comments.is_selected():
            pass
        else:
            id_enable_comments.click()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配置中心理论学习

配置中心是一种用于集中管理应用程序配置信息的系统或服务。在微服务架构中,由于服务数量众多且可能分布在不同的环境中,配置中心的作用尤为突出。它允许开发者将配置信息从应用程序代码中分离出来,集中存储和管理,从而提高配置的…

训练营第三十八天 | 309.最佳买卖股票时机含冷冻期动态规划系列七总结714.买卖股票的最佳时机含手续费股票问题总结篇!

309.最佳买卖股票时机含冷冻期 力扣题目链接(opens new window) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票&#x…

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令,脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本,但侧重点各不相同,grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对…

硬件SPI读写W25Q64

硬件SPI读写W25Q64 接线图(和软件SPI一样) 使用SPI1,SCK,接PA5;MISO,接PA6;MOSI,接PA7;NSS,可接PA4。 接线图对应:PA5接CLK引脚,PA6…

基于深度学习的红外船舶检测识别分类完整实现数据集8000+张

随着遥感技术的快速发展,包括无人机、卫星等,红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像,红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来,深度学习作为一种强大的图像处理技术&#xff0…

微服务链路追踪ELK

微服务链路追踪&ELK 链路追踪概述链路追踪sluthzipkinelk日志管理平台 一 链路追踪 1 概述 1.1 为什么需要链路追踪 ​ 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0…

sqoop的安装配置

1. 上传并解压安装包 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../server/ 重命名:mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop 2. 配置环境变量 sudo vim /etc/profile # 配置sqoop的环境变量 export SQOOP_HOME/export/server/sqoop export PATH$PATH…

Camtasia2024破解永久激活码注册码分享最新

随着数字时代的到来,视频制作已成为许多人日常生活和工作中不可或缺的一部分。而在众多视频编辑软件中,Camtasia凭借其强大的功能和易用性,赢得了广泛的用户喜爱。近期,Camtasia 2024的破解版本在网络上引起了广泛关注。本文旨在为…

FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《03》

系列文章 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《01》 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《02》 说明 在上篇 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《02》 开始移植适配 FreeRTOS,FreeRTOS 移植适配…

大数据技术学习回顾01-大数据的特点、技术体系(三驾马车)

参考来源: 极客时间专栏:从0开始学大数据,作者:李智慧 大数据技术整体概览 大数据技术体系 大数据处理的主要应用场景包括数据分析、数据挖掘与机器学习。数据分析主要使用 Hive、Spark SQL 等 SQL 引擎完成;数据挖…

LaTeX 学习 第2节 数学结构

----用教授的方式学习 目录 2.1 上标与下标 2.2 上下画线与花括号 2.3 分式 2.4 根式 2.5 矩阵 ​​​​​​​LaTex安装包:https://download.csdn.net/download/weixin_38135241/89416392 LaTex- windows安装包:https://download.csdn.net/down…

unity38——MemoryProfiler性能分析器,截帧分析当前性能占用率的具体文件

定义:性能分析器 (Unity Profiler) 是一种可以用来获取应用程序性能信息的工具。可以将性能分析器连接到网络中的设备或连接到已连接到计算机的设备,从而测试应用程序在目标发布平台上的运行情况。还可以在 Editor 中运行性能分析器,从而在开…

ESP32 BLE学习(0) — 基础架构

前言 (1)学习本文之前,需要先了解一下蓝牙的基本概念:BLE学习笔记(0.0) —— 基础概念(0) (2) 学习一款芯片的蓝牙肯定需要先简单了解一下该芯片的体系结构&a…

shell编程基础(第18篇:更多的文件操作命令介绍)

前言 对于文件来说,除了它的文件内容之外,就是对其文件本身的操作,比如我们想要重命名文件、移动文件、复制文件、已经获取文件所在目录,文件名等操作,今天一起学习更多的文件操作相关的命令 basename 用于获取文件名…

使用Stable Diffusion制作角色三视图

使用Stable Diffusion制作角色三视图,可以借助ControlNet功能来实现人物姿势控制,并结合LoRA模型进行精细调整。以下是一般步骤: 安装Stable Diffusion WebUI: 建议使用最新版本,并确保已安装并正确配置ControlNet和LoRA模型。 准…

最新2024FL Studio21中文激活注册码获取方法步骤教程!

在音乐创作领域,FL Studio21无疑是一款强大的工具。然而,对于许多初学者来说,如何正确注册和激活FL Studio21成了一个难题。今天,我们就来为大家详细解答这个问题。 我们需要在FL Studio21的官方网站上购买正版软件。 在购买过程…

Interlinks Manager评测:WordPress 的最佳内部链接插件?

在这篇Interlinks Manager评测中,我们将彻底查看它是否真的是 WordPress 最佳内部链接插件!我们还将检查它是否值得您尝试。现在就开始吧 快速浏览一下插件,你就会对其提供的功能有一个基本的了解。 Interlinks Manager是一款 SEO 插件&…

Linux笔记--权限与属性命令、查找指令、压缩命令、网络指令

权限 使用ls指令查看详细信息时 rwx分别代表读写执行三种权限,book代表book用户,对于权限来说三种权限分别代表二进制一位,即同时拥有rwx就是111,此时这个文件权限为775 改变权限为rw-rwxr-w指令 book100ask:~/Desktop$ chmod …

傲星一个在线工具箱源码附搭建教程

傲星工具箱源码是一款功能强大的在线工具箱程序,您可以通过安装扩展来增强其功能。同时,该程序还提供了插件模板的功能,让您可以将其作为网页导航使用。 1.PHP版本需不低于7.2.5。 2.Mysql版本需不低于5.7。 3.需要安装fileinfo扩展。 4.…

中望CAD 2025 (ZW3D2025) 简体中文修改版

名称:中望CAD 2025 (ZW3D2025) 简体中文修改版 描述:一款三维CAD设计工具,运行破解补丁ZW3D2025-2024-Patch执行修补。 链接:夸克网盘分享 📁 大小:3.2GB 🏷 标签:#PC软件 #CAD #设…