本文是基于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++++
python
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
python
[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
python
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()
下面介绍一下代码的实现
python
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的类。这里是直接调用登录功能。
python
# 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()
先点我的媒体,点击媒体,再点击编辑媒体
python
# 5、设置标题
login.find_element_by_id('id_title').clear()
login.find_element_by_id('id_title').send_keys('小猴子.MP4')
设置标题前应先清空输入框
python
# 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') #第几个选项
python
# 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')
设置标签和产生日期。
python
# 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('私有')
正常定位元素并发送值就可以。
python
# 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版本。我们要将待执行的命令指向要执行的文件。
python
[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()