一、查看当前运行的浏览等相关信息

 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-自动化数据驱动及模型介绍的更多相关文章

  1. python 并发编程 多进程 生产者消费者模型介绍

    一 生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务, 生产数据目的,是为了给消费者处理. 在并发编程中,如果生产者处理速度很快,而消费者处理 ...

  2. python+request接口自动化框架

    python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...

  3. Python实现浏览器自动化操作

    Python实现浏览器自动化操作 (2012-08-02 17:35:43) 转载▼     最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是 ...

  4. [转载]Python实现浏览器自动化操作

    原文地址:Python实现浏览器自动化操作作者:rayment   最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是支持IE,而且项目也较久没 ...

  5. 从零学习基于Python的RobotFramework自动化

    从零学习基于Python的RobotFramework自动化 一.        Python基础 1)      版本差异 版本 编码 语法 其他 2.X ASCII try: raise Type ...

  6. 使用appium+python做UI自动化的demo

    使用appium+python做UI自动化的demo 案例使用的知乎app,下载最新的知乎apk,存在了电脑上,只需要配置本机上app目录,不需要再配置appPackage和appActivity # ...

  7. Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

    齿轮发出咔嚓一声,向前进了一格.而一旦向前迈进,齿轮就不能倒退了.这就是世界的规则. 0x01背景 造了个轮子:御剑师傅的ipintervalmerge的Python版本.觉得打印的提示信息如果是普通 ...

  8. 如何利用python实现报表自动化?让你更高效的完成工作内容

    如果能够实现报表自动化,那我们将节约不少的时间,更高效的完成工作内容.那么,如何利用python实现报表自动化呢?本文将介绍xlwt .xlrd.xlutils的常用功能,xlwt写Excel时公式的 ...

  9. 基于python的webUI自动化-小白基础篇

    最近打算研究一下基于python的webUI自动化,先自学了一下相关基础知识,大概用了一个多月的时间,主要是找视频,一边看视频或者文档一边对照着敲代码运行. 重点强调:一定要一边看一边对照着敲代码运行 ...

随机推荐

  1. $.getJSON获取json数据失败

    首先简单介绍下 $.ajax  $.get  $.post  $.getJSON 的区别和用法 $.ajax中有一个type属性,专门用来指定是get请求还是post请求的分别对应的就是$.get和$ ...

  2. SAP 如何看某个TR是否传入了Q或者P系统?

    SAP 如何看某个TR是否传入了Q或者P系统? 两种方式可以查询. 1)进入Q系统或者P系统.SE16,看表TPALOG, 输入请求号码, 执行,看记录里的字段TPSTAT_KEY是否为空,如果不为空 ...

  3. Premiere Pro CC2018安装教程

    Premiere Pro CC2018安装教程 下载安装包:去官网下载或者百度PR2018的安装包 解压安装包后,找到Set-up.exe,右键,打开 安装的时候我们需要注册一个账号,点击“获取Ado ...

  4. M5310-A 版本

         模块外表            型号                           BAND                          M5310-A MBRH0S04 +NB ...

  5. 为什么你SQL Server中SQL日期转换出错了呢?

    开发人员有时候使用类似下面SQL将字符串转换为日期时间类型,乍一看,这样的SQL的写法是没有什么问题的.但是这样的SQL其实有时候就是一个定时炸弹,随时可能出现问题(),下面简单对这种情况进行一个简单 ...

  6. HDU-1754 I Hate It (树状数组模板题——单点更新,区间查询最大值)

    题目链接 ac代码(注意字符读入前需要注意回车的影响) #include<iostream> #include<cstdio> #include<cstring> ...

  7. " ModuleNotFoundError: No module named 'tkinter' "的解决方法

    踩坑场景 在使用pillow这个包处理图片的时候,运行程序,报错ModuleNotFoundError: No module named 'tkinter',遇到ModuleNotFoundError ...

  8. EPEL添加与删除

    EPEL简介 EPEL的全称叫 Extra Packages for Enterprise Linux,由Fedora社区打造,如它的全称,这是一个为红帽系列及衍生发行版如CentOS.Fedora提 ...

  9. 优酷爱奇艺视频转换为MP4格式工具

    本君今天分享两个免费的视频格式转换工具,分别是爱奇艺和优酷的(腾讯的有点复杂,等整理完再分享).教程都是一步步亲手操作的,每一步都有配图.希望各位老板多转发分享,谢谢! 一爱奇艺QSV转MP4格式 解 ...

  10. .net 父类值赋给子类

    1.最简单的方式,反射+泛型 优点:字段修改时,无需更改代码,只需要更新实体即可 缺点:因为用到反射,可能效率会稍微弱那么一点点,没有实际用太多字段测试 public static cClass Pa ...