Selenium3+python自动化013-自动化数据驱动及模型介绍
一、查看当前运行的浏览等相关信息
driver=webdriver.Chrome()
print(driver.capabilities["version"]) #浏览器版本
print(driver.capabilities["platform"]) #浏览器运行平台
print(driver.capabilities["browserName"]) #浏览器名称
75.0.3770.100
Windows NT
chrome
二、自动化测试框架搭建篇:数据驱动测试
1.数据驱动概述
相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动。
实施数据驱动测试步骤如下:
(1)编写测试脚本,脚本需要支持从程序对象、文件或数据库读入测试数据
(2)将测试脚本使用的测试数据存入程序对象、文件或数据库等外部介质中
(3)运行脚本过程中,循环调用存储在外部介质中的测试数据
(4)验证所有的测试结果是否符合预期结果
# @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By # 打开浏览器
def openBroswer():
driver = webdriver.Chrome()
return driver
# 获取URL地址
def openUrl(driver, url):
driver.get(url)
driver.maximize_window() # 元素是否存在
def ele_is_presence(driver, tuple_arg):
return WebDriverWait(driver, 10).until(EC.presence_of_element_located(tuple_arg)) # 点击操作
def ele_click(driver, tuple_arg):
ele_is_presence(driver, tuple_arg).click() # 发送文本
def ele_sendKeys(driver, tuple_arg, keyword):
ele_is_presence(driver, tuple_arg).send_keys(keyword) # 检查登录结果
def checkResult(driver, loginfo):
try:
ele_is_presence(driver, loginfo)
print("登录状态验证通过!")
except:
print("登录失败!")
# 退出
def quitbrowser(driver):
sleep(2)
driver.quit() class Test_Login():
url = 'http://daxue.qysxy.com.cn/admin/static/front/html/login.html'
account = ['fuguang',"admin","fuguangl"]
pwd = ['','','']
c = ['', '','']
username = (By.NAME, "username") # 用户名输入框
password = (By.NAME, "password") # 密码输入框
code = (By.ID, "code") # 验证码输入框
loginbtn = (By.ID, 'loginBtn') # 登录按钮 # 实例化driver
driver = openBroswer()
# 打开url
openUrl(driver, url)
# 首页点击登录按钮
ele_click(driver, loginbtn) length = len(account)
# 输入用户名
for i in range(0, length):
#for j in range(0, length):
ele_sendKeys(driver, username, account[i])
# 输入密码
ele_sendKeys(driver, password, pwd[i])
# 输入验证码
ele_sendKeys(driver,code,c[i])
# 点击登录按钮
ele_click(driver, loginbtn)
sleep(3)
driver.refresh()
quitbrowser(driver) if __name__ == '__main__':
Test_Login()
简单的数据驱动设计模式
对上面的数据整理到一个文件中,如下所示,导入到Excel中
2.数据驱动单元测试的环境准备
2.1、openpyxl模块的安装:pip install openpyxl,验证方式如下:from openpyxl import load_workbook
没有报错证明安装成功。
2.2、注意openpyxl只能操作xlsx文件而不能操作xls文件
2.3、在openpyxl中,主要用到三个概念:Workbooks,Sheets,Cells
(1)Workbook就是一个excel工作表,如下操作
#打开一个xlsx文件
wb=load_workbook('test.xlsx')
(2)Sheet是工作表中的一张表页,如下有三种方式
#获取一张表(一)
# sheet1=wb.get_sheet_by_name('Sheet1')
#获取一张表(二)
# sheet1=wb['Sheet1']
#获取一张表(三)
sheet1=wb.worksheets[0]
(3)Cell就是简单的一个格
# @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- from openpyxl import load_workbook #打开一个xlsx文件
wb=load_workbook('test_budaoguan.xlsx') #获取一张表(一)
# sheet1=wb.get_sheet_by_name('Sheet1')
#获取一张表(二)
# sheet1=wb['Sheet1']
#获取一张表(三)
sheet1=wb.worksheets[0]
# 打印sheet1
print(sheet1) #表格中输入内容,注意:当文件打开时,数据写不进去。
sheet1['A1']='TEST'
#保存(修改之后需要保存,否则修改无效)
wb.save('test_budaoguan.xlsx') 运行结果如下
#打印表名
print("表名:",sheet1.title)
#读取一整行(传入行号)
print("读取一整行:",sheet1[1])
#读取某一列
print("读取某一列:",sheet1['A'])
#读取某一格的值
print("读取某一格:",sheet1['A1'])
print("读取某一格的值:",sheet1['A1'].value) #获取最大行数
print("获取最大行数:",sheet1.max_row)
#获取最大列数
print("获取最大列数:",sheet1.max_column)
运行结果:
表名: Sheet2
读取一整行: (<Cell 'Sheet2'.A1>,)
读取某一列: (<Cell 'Sheet2'.A1>,)
读取某一格: <Cell 'Sheet2'.A1>
读取某一格的值: TEST
获取最大行数: 1
获取最大列数: 1
# 获取所有行
# print(sheet1.rows)
# 获取所有的列
# print(sheet1.columns)
3.使用Excel进行数据驱动测试
测试逻辑:
1.打开百度首页,从Excel文件中读取数据作为搜索关键词
2.在搜索输入框中输入读取出的搜索关键词
3.单击搜索按钮
4.断言搜索结果页面中是否出现Excel文件中提供的预期内容,包含则认为测试执行成功,否则认为失败
如下图所示:
# 获取所有行
print(sheet1.rows)
# 获取所有的列
print(sheet1.columns) # 遍历行
for row in sheet1.rows:
# 遍历行中是格
for cell in row:
print(cell.value,end='\t')
print()
print(20*'=')
# 遍历列
for column in sheet1.columns:
#遍历列中的格
for cell in column:
print(cell.value, end='\t')
print()
运行结果
<generator object Worksheet._cells_by_row at 0x000000000BA6BFC0>
<generator object Worksheet._cells_by_col at 0x000000000BA6BFC0>
序号 搜索词 期望结果
1 郎平 排球
2 李宁 体操
3 王楠 乒乓球
====================
序号 1 2 3
搜索词 郎平 李宁 王楠
期望结果 排球 体操 乒乓球
以上的方法封装到一个类中
# @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- from openpyxl import load_workbook # 建立一个ExcelMethod类
class ExcelMethod():
def readExcel(self,filename):
self.filename = filename
# 创建一个大列表
excel_list = [] # # 创建一个小列表
# son_list = [] # 获取workbook对象
self.wb = load_workbook(self.filename)
# 获取第二个sheet表
self.sheet = self.wb.worksheets[3]
# 获取行
for row in self.sheet.rows:
# 为了避免son_list.append无限追加值,每次换行清空一次值
son_list = []
# 获得每一行的一列
for cell in row:
# 取出值
# print(cell.value)
# 把第一行里的内容按列表加入到son_list[]中
son_list.append(cell.value) # 把小列表加入到大列表里中
excel_list.append(son_list)
# 打印出列表
print(excel_list)
# 列表切片操作从取出1以后的列表
return excel_list[1:] if __name__== "__main__":
# ExcelMethod().readExcel("test_budaoguan.xlsx")
print(ExcelMethod().readExcel("test_budaoguan.xlsx"))
建立一个ExcelMethod类,读取excel文件
# @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- import unittest
from selenium import webdriver
from qianyan.test_budaoguan.excel_method import ExcelMethod
from time import sleep class Excel_Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
# 调用浏览器
cls.driver = webdriver.Chrome()
# 输入url地址
cls.driver.get("http://daxue.qysxy.com.cn/admin/static/front/html/login.html")
# 页面最大化
cls.driver.maximize_window()
# 读取文件
cls.excelmethod = ExcelMethod()
cls.user_list = cls.excelmethod.readExcel("test_budaoguan.xlsx") # 测试方法
def test_search(self):
for i in range(0,len(self.user_list)):
# 获取元素位置,用户名输入框
username = self.driver.find_element_by_id("username")
# 获取元素位置,密码输入框
password = self.driver.find_element_by_id("password")
# 获取元素位置,验证码输入框
code = self.driver.find_element_by_id("code")
# 清空用户名输入框
username.clear()
password.clear() # 清空用户名输入框
code.clear() # 清空验证码输入框
# 填写用户名输入框,填写第一个列表中的第二个数据,为了让数据按顺序自动往下执行,加入for循环状态
username.send_keys(self.user_list[i][1])
password.send_keys(self.user_list[i][2])
code.send_keys(self.user_list[i][3])
sleep(1)
self.driver.find_element_by_id("loginBtn").click()
# # 出现弹框
# btn = self.driver.switch_to_alert()
# sleep(3)
# # 获取按钮上的文本
# print(btn.text)
sleep(3)
self.assertTrue(self.user_list[i][4] in self.driver.page_source)
# 打印页面源码
print(self.driver.page_source) @classmethod
def tearDownClass(cls):
cls.driver.quit() if __name__ == "__main__":
unittest.main()
建一个测试方法调取ExcelMethod类
Selenium3+python自动化013-自动化数据驱动及模型介绍的更多相关文章
- python 并发编程 多进程 生产者消费者模型介绍
一 生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务, 生产数据目的,是为了给消费者处理. 在并发编程中,如果生产者处理速度很快,而消费者处理 ...
- python+request接口自动化框架
python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...
- Python实现浏览器自动化操作
Python实现浏览器自动化操作 (2012-08-02 17:35:43) 转载▼ 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是 ...
- [转载]Python实现浏览器自动化操作
原文地址:Python实现浏览器自动化操作作者:rayment 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是支持IE,而且项目也较久没 ...
- 从零学习基于Python的RobotFramework自动化
从零学习基于Python的RobotFramework自动化 一. Python基础 1) 版本差异 版本 编码 语法 其他 2.X ASCII try: raise Type ...
- 使用appium+python做UI自动化的demo
使用appium+python做UI自动化的demo 案例使用的知乎app,下载最新的知乎apk,存在了电脑上,只需要配置本机上app目录,不需要再配置appPackage和appActivity # ...
- Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)
齿轮发出咔嚓一声,向前进了一格.而一旦向前迈进,齿轮就不能倒退了.这就是世界的规则. 0x01背景 造了个轮子:御剑师傅的ipintervalmerge的Python版本.觉得打印的提示信息如果是普通 ...
- 如何利用python实现报表自动化?让你更高效的完成工作内容
如果能够实现报表自动化,那我们将节约不少的时间,更高效的完成工作内容.那么,如何利用python实现报表自动化呢?本文将介绍xlwt .xlrd.xlutils的常用功能,xlwt写Excel时公式的 ...
- 基于python的webUI自动化-小白基础篇
最近打算研究一下基于python的webUI自动化,先自学了一下相关基础知识,大概用了一个多月的时间,主要是找视频,一边看视频或者文档一边对照着敲代码运行. 重点强调:一定要一边看一边对照着敲代码运行 ...
随机推荐
- MongoDB集群负载不均衡问题定位及解决
1.问题描述 这是一套运行在腾讯云上的MongoDB 3.6版本集群,共5个分片,每片规格是6核16GB. 在压测的过程中,发现第3个分片的CPU使用率长时间高达96%,其它4个分片的CPU使用率都没 ...
- 这个 Python 代码自动补全神器搞得我卧槽卧槽的
是时候跟你说说这个能让你撸代码撸得舒服得不要不要的神器了——kite. ! 简单来说,它是一款 IDE 的插件,能做到代码自动补全,可能你会说了,这有什么牛逼的?一般的编辑器不都有这个功能么 ...
- Orleans[NET Core 3.1] 学习笔记(四)( 2 )获取Grain的方式
简介 在这一节,我们将介绍如何在Silo和Client中获取Grain及调用Grain Grain获取方式 从Grain内部获取: //根据特定的Key值创建或获取指定的Grain IStudent ...
- Android_向用户发送短信
一段代码,用的时候copy就行 记得在manifest里声明send-sms和read-sms权限 public class SendMsgActivity extends AppCompatActi ...
- MySQL 8 拷贝MySQL数据库到另一台机器
通过mysqldump生成包含SQL语句的文件,然后将其应用到目标机器的mysql客户端程序. mysqldump --help 可以获取mysqldump选项以及用法. 如果源服务器上启用了GTID ...
- 题解【CF1311F Moving Points】
\[ \texttt{Preface} \] 赛时,把 " 任意时刻 " 理解成 " 整数时刻 " 了,看起来一脸不可做的亚子,还各种推式子. 话说我为什么觉得 ...
- SSH自动断开后重连的解决方案
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/ssh-conn ...
- 证明task线程是来源于线程池的,线程重用
1.线程池是单例的,全局唯一的,设置线程池最大活跃线程数是5,设置后,允许同时并发的Task只有5个,我们开启100个task去做任务,从最后的输出结果看到,虽然开启了100个task,但是线程id始 ...
- 令人抓狂的redis和rediscluster Python驱动包的安装
本文环境:centos 7,Python3编译安装成功,包括pip3,然后需要安装redis相关的Python3驱动包,本的redis指redis包而非redis数据库,rediscluster类似. ...
- Linux systemctl系统工具常用总结(详)
systemctl是一个系统自带的服务管理工具,可以管理系统的服务的,启动.停止.重启.自启.监视.也可以对脚本程序后台运行管理. 文章以nginx.service举例 基础命令: systemctl ...