Pytest 读取excel文件参数化应用

news2024/11/26 2:39:00

本文是基于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()

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

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

相关文章

618洗地机全网热门推荐,跟着买错不了

步入酷热夏天,家中的清洁工作也迎来了新的挑战。天气炎热,细菌、异味滋生的困扰让日常打扫变得不再轻松,这时一台高性能的洗地机就成了提升生活品质的必备良品。不同于洗地机的技术与类别繁多,洗地机虽原理不复杂,但在…

堆栈溢出的攻击 -fno-stack-protector stack smash 检测

在程序返回的一条语句堆栈项目处&#xff0c;用新函数的起始地址覆盖&#xff0c;将会跳转到执行新函数。 现在系统对这个行为做了判断&#xff0c;已经无法实施这类攻击或技巧。 1&#xff0c;测试代码 #include <stdio.h> void cc() {printf("I am cc( )\n"…

【AI+编程】工作日常场景随时可以AI编程,记一个问答SQL快速导出数据日常示例

今天有个场景&#xff0c;我们有个老项目&#xff0c;由于历史原因差不多1年多没使用了&#xff0c;恰巧客户紧急情况要使用。因为当时没有需求&#xff0c;所以V1.0上线后 就没做更新。 需求很简单&#xff1a;我们假定 项目问题表、客户表、问题答案表&#xff0c; 实时查询…

VisionOS的未来愿景:苹果VisionPro创业者的愿望清单

随着苹果公司在增强现实(AR)领域的不断探索,VisionPro作为其前沿产品,已经开始展现出改变我们与数字世界互动方式的潜力。作为一名VisionPro创业者,对未来VisionOS的更新充满了期待,并提出了一系列愿望清单,这些愿望不仅代表了个人的需求,也反映了用户社区对苹果AR生态的…

【ETAS CP AUTOSAR基础软件】DET、Bfx、CRC、ComStack、rba_ArxmlGen模块详解

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中DET、Bfx、CRC、ComStack、rba_ArxmlGen模块相关的内容详解。本文从AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解DET、Bfx、CRC、ComStack、rba_ArxmlGen。文中涉及…

logTrick

贴一下灵神的题解里面的解释~ 就是一种优化策略&#xff0c;logtrick class Solution { public:int minimumDifference(vector<int>& nums, int k) {int res 0x3f3f3f3f;int n nums.size();for(int i0;i<n;i){res min(res,abs(nums[i]-k));for(int j i-1;j&g…

2024年6月15日 (周六) 叶子游戏新闻

期刊杂志: 聚合读者、意林、知音、故事会、花火以及国内各大知名报纸电子版&#xff0c;无需付费即可观看各种免费资源 中医自学宝典: 集合了中医医案&#xff0c;医经&#xff0c;方剂 药材知识的app&#xff0c;更方便的免费学习中医知识 《赛博朋克2077》被取消DLC泄露&…

20240615在WIN11下的串口调试助手的下载安装以及使用

20240615在WIN11下的串口调试助手的下载安装以及使用 2024/6/15 18:06 百度&#xff1a;串口调试助手 blob:https://apps.microsoft.com/df934d29-fd7a-4873-bb6b-a4ab5a7934c9 串口调试助手 Installer.exe 收发的LOG&#xff1a; rootok3588:/# ./uart_test /dev/ttyS0 11520…

springboot+vue+mybatis家电系统+PPT+论文+讲解+售后

随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了家电销售系统的开发全过程。通过分析企业对于家电销售系统的需求&#xff0c;创建了一个计算机管理家电销售系统的方案。文章介绍了家电销售系统的系统分析部分&#…

cs与msf权限传递,以及mimikatz抓取明文密码

cs与msf权限传递&#xff0c;以及mimikatz抓取win10明文密码 1、环境准备2、Cobalt Strike ------> MSF2.1 Cobalt Strike拿权限2.2 将CS权限传递给msf 3、MSF ------> Cobalt Strike3.1 msf拿权限3.2 将msf权限传递给CS 4、使用mimikatz抓取明文密码 1、环境准备 攻击&…

【Apache Doris】Compaction 原理 | 实践全析

【Apache Doris】Compaction 原理 | 实践全析 一、Compaction 前文概要二、Compaction 版本策略三、Compaction 类型说明四、Compaction 工程实现五、Compaction 生产实践 作者 &#xff5c; 俞剑波 一、Compaction 前文概要 LSM-Tree 简介 LSM-Tree&#xff08; Log Structu…

Three.js做了一个网页版的我的世界

前言 笔者在前一阵子接触到 Three.js 后, 发现了它能为前端 3D 可视化 / 动画 / 游戏方向带来的无限可能, 正好最近在与朋友重温我的世界, 便有了用 Three.js 来仿制 MineCraft 的想法, 正好也可以通过一个有趣的项目来学习一下前端 3D 领域 介绍 游戏介绍 相信大家对我的世…

Swift开发——循环执行方式

本文将介绍 Swift 语言的循环执行方式 01、循环执行方式 在Swift语言中,主要有两种循环执行控制方式: for-in结构和while结构。while结构又细分为当型while结构和直到型while结构,后者称为repeat-while结构。下面首先介绍for-in结构。 循环控制方式for-in结构可用于区间中的…

推荐这两款非常良心的录屏和文字转语音工具,很是让人心动,不要错过

VPot FREE 吾爱大神制作的文字转音频工具&#xff0c;免费使用。 支持英语、韩语、法语、日语等语言&#xff0c;还是支持男声、女声和儿童声音。 支持将以导入文本的格式转换成音频&#xff0c;并保存为MP3、WAV等常见的音频格式。 VPot FREE提供智能断句的功能&#xff0…

深度学习(八)——神经网络:卷积层

一、卷积层Convolution Layers函数简介 官网网址&#xff1a;torch.nn.functional — PyTorch 2.0 documentation 由于是图像处理&#xff0c;所以主要介绍Conv2d。 class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, b…

Linux host映射 设置主机名并通过主机名找到指定系统

一、windows ping linux 1.windows进入到 C:\Windows\System32\drivers\etc\hosts 内&#xff0c;使用edit with notepad打开hosts文件&#xff0c;在下面添加需要寻找的ip以及其主机名。该ip以及主机名即linux的一致。需要查看linux主机名的在终端使用 hostname进行查看&#…

ARP协议相关

把ip地址解析成mac地址这里的mac地址就是路由器的mac地址 免费ARP 源ip和目的ip都是一样的&#xff0c;那怎么让其他人更新arp表呢&#xff1f;&#xff1f; 是因为目标mac是全f&#xff0c;是一个广播报文 如果冲突就是ip一样但是mac又不一样 代理ARP pc1和pc4是在同一个子网…

MySQL----慢查询日志

慢日志 MySQL可以设置慢查询日志&#xff0c;当SQL执行的时间超过我们设定的时间&#xff0c;那么这些SQL就会被记录在慢查询日志当中&#xff0c;然后我们通过查看日志&#xff0c;用explain分析这些SQL的执行计划&#xff0c;来判定为什么效率低下。 查看相关信息 show va…

计算机体系结构重点学习(一)

从外部I/O与上层应用交互的整体软硬件过程 上层应用发出I/O请求&#xff1a;上层应用程序&#xff0c;如一个文本编辑器、网络浏览器或者任何软件应用&#xff0c;需要读取或写入数据时&#xff0c;会通过调用操作系统提供的API&#xff08;如文件操作API、网络操作API等&…

【CDN】逆天 CDN !BootCDN 向 JS 文件中植入恶意代码

今天在调试代码&#xff0c;突然控制台出现了非常多报错。 这非常可疑&#xff0c;报错指向的域名也证实了这一点。 因为我的 HTML 中只有一个外部开源库&#xff08;qrcode.min.js&#xff09;&#xff0c;因此只有可能是它出现了问题。 我翻看了请求记录&#xff0c;发现这…