Pytest 读取excel文件参数化应用

作者 : admin 本文共10998个字,预计阅读时间需要28分钟 发布时间: 2024-06-16 共1人阅读

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

1、编辑媒体需求

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

Pytest 读取excel文件参数化应用插图

具体表单如下图所示

1、登录

2、点击我的媒体

3、点击媒体

Pytest 读取excel文件参数化应用插图(1)

4、点击编辑媒体

Pytest 读取excel文件参数化应用插图(2)

5、设置标题

6、设置媒体标题分类

7、设置标签001

8、设置产生日期

9、上传图片

10、描述

Pytest 读取excel文件参数化应用插图(3)

11、状态

12、启动评论

13、缩略图时刻

14、允许下载

Pytest 读取excel文件参数化应用插图(4)

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

Pytest 读取excel文件参数化应用插图(5)

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 est_cases est_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()

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

Pytest 读取excel文件参数化应用插图(6)

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

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

Pytest 读取excel文件参数化应用插图(7)

        # 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

设置媒体的标题分类

Pytest 读取excel文件参数化应用插图(8)

这里涉及到下拉框的操作

下拉框操作
    假设有一个元素使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')

Pytest 读取excel文件参数化应用插图(9)

设置标签和产生日期。

        # 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('私有')

Pytest 读取excel文件参数化应用插图(10)

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

        # 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 读取excel文件参数化应用插图(11)

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

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

Pytest 读取excel文件参数化应用插图(12)

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的测试数据文件,进行操做。

Pytest 读取excel文件参数化应用插图(13)

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

Pytest 读取excel文件参数化应用插图(14)

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循环遍历,并用逗号隔开他们。

Pytest 读取excel文件参数化应用插图(15)

        # 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中要求启用评论,那么不操作,反之就勾选。这里面涉及到一个多重判断。

Pytest 读取excel文件参数化应用插图(16)

        # 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()

本站无任何商业行为
个人在线分享 » Pytest 读取excel文件参数化应用
E-->