基于python+selenium的框架思路(二)
一、如下是用例格式,第一个sheet为用例汇总,后面的sheet为具体的用例步骤
sheet:测试用例
sheet:搜索
sheet:刘江博客验证
二、读取该excel文件取出关键字等信息,作为关键字的参数,通过反射机制传递给关键字方法去执行。
关键字模块如下:ObjectMap.py
- # coding:utf-8
- from selenium.webdriver.support.ui import WebDriverWait
- # 获取单个页面元素对象
- def get_element(driver, locationType, locatorExpression):
- try:
- element = WebDriverWait(driver, 3).until(lambda x:x.find_element(by=locationType,value = locatorExpression))
- return element
- except Exception, e:
- raise e
- # 获取一组元素
- def get_elements(driver , locationType, locatorExpression):
- try:
- elements = WebDriverWait(driver, 3).until(lambda x:x.find_elements(by=locationType,value=locatorExpression))
- return elements
- except Exception, e:
- raise e
- # 由于关键字函数的参数个数不一样,所以通过传递动态参数*args实现传参,关键字方法
- # 最多需要(driver , locationType, locatorExpression, operationValue)四个参数
- def open_browser(driver, *args):
- driver.get(args[2])
- def input_string(driver, *args):
- try:
- WebDriverWait(driver, 3).until(lambda x: x.find_element(by=args[0], value=args[1])).send_keys(args[2])
- except Exception:
- raise
- def click(driver, *args):
- WebDriverWait(driver, 3).until(lambda x: x.find_element(by=args[0], value=args[1])).click()
- def assert_equal(driver, *args):
- try:
- assert args[2] in driver.title
- except AssertionError, e:
- raise AssertionError(e)
- except Exception, e:
- raise e
三、测试用例执行模块
- # coding:utf-8
- from util import ObjectMap, ExcelUtil
- import xlrd, xlwt
- import time
- from xlutils.copy import copy
- def run_test():
- from selenium import webdriver
- start_time = time.time()
- # 读取excel中的关键字的值,定位方式的值,定位表达式,和操作值等参数值。然后将参数值传到对应关键字方法中
- excelFile = xlrd.open_workbook(r"D:\KeyWordsFrameWork\testScripts\search.xlsx", formatting_info=True)
- sheet0 = excelFile.sheet_by_index(0) # 获取第一个sheet页
- # 循环第一个sheet页,其中每一行代表一条用例
- for row0 in range(1, sheet0.nrows):
- # 一定要在这个for循环里面再写一次excelFile,要不然执行多条用例时只会在最后一条用例写入结果
- excelFile = xlrd.open_workbook(r"D:\KeyWordsFrameWork\testScripts\search.xlsx", formatting_info=True)
- driver = webdriver.Chrome()
- case_name = sheet0.row_values(row0)[3] # 获取用例对应的sheet页
- sheet = excelFile.sheet_by_name(case_name) # 从第一个sheet中获取对应的用例名称找到对应的用例sheet
- maxRows = sheet.nrows # 获取用例的最大行数,也就是步骤数
- successfulSteps = 0 # 定义执行成功的步骤数
- retDict = {} # 存放用例结果的字典
- if sheet0.row_values(row0)[4] == 'y': # 只执行标记为y的用例
- # print case_name
- for row in range(1, maxRows): # 循环用例步骤
- keyword = sheet.row_values(row)[2] # 读取关键字列
- # print keyword
- locationType = sheet.row_values(row)[3] # 获取定位方式
- if locationType not in ['id','xpath','name']:
- pass
- locatorExpression = sheet.row_values(row)[4] # 获取定位表达式的值
- operationValue = sheet.row_values(row)[5] # 获取操作值
- # dir(ObjectMap)获取该模块的所有方法和变量
- # print dir(ObjectMap)
- # 遍历ObjectMap中的方法和属性,如果有名称一致的则通过反射调用对应方法执行关键字
- for i in dir(ObjectMap):
- if keyword == i:
- # print i
- # 要用到反射机制,通过函数名字符串调用对应方法:http://www.liujiangblog.com/course/python/48
- if hasattr(ObjectMap, keyword):
- # print '有这个方法'
- func = getattr(ObjectMap, keyword)
- try:
- func(driver, locationType, locatorExpression, operationValue)
- print '%s:execute OK' % keyword
- # 执行每个关键字成功后,成功步数+1
- successfulSteps += 1
- except Exception:
- print '%s:excute ERROR' % keyword
- finally:
- # 如果成功的步骤数等于用例的步骤数,则整条用例执行成功,写入执行结果
- if successfulSteps == sheet.nrows - 1:
- retDict['result'] = 'PASS'
- print retDict['result']
- end_time = time.time()
- take_time = end_time - start_time
- print take_time
- # 向已经存在的excel中写入时,需要先copy,copy后sheet页获取sheet方法为get_sheet,与
- # 原来的获取方法不一样
- excleFileCopy = copy(excelFile)
- case_sheet = excleFileCopy.get_sheet(0)
- case_sheet.write(row0, 5, take_time)
- case_sheet.write(row0, 6, retDict['result'])
- # 写入后需要save
- excleFileCopy.save(r"D:\KeyWordsFrameWork\testScripts\search.xlsx")
- print 'pass write is ok'
- else:
- retDict['result'] = 'FAIL'
- print retDict['result']
- end_time = time.time()
- take_time = end_time - start_time
- print take_time
- excleFileCopy = copy(excelFile)
- case_sheet = excleFileCopy.get_sheet(0)
- case_sheet.write(row0, 5, take_time)
- case_sheet.write(row0, 6, retDict['result'])
- excleFileCopy.save(r"D:\KeyWordsFrameWork\testScripts\search.xlsx")
- print 'fail write is ok'
- else:
- raise Exception
- driver.quit()
- if __name__ == '__main__':
- run_test()
基于python+selenium的框架思路(二)的更多相关文章
- 基于python+selenium的框架思路
设想: 1.使用excel编写用例第一个sheet页为用例概要格式如下: 后面的sheet页为具体的用例步骤: 实现所有定位信息都与测试代码分离 2.读取该excel文件取出关键字等信息,作为关键字的 ...
- web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架
基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架 by:授客 QQ:1033553122 博客:http://blog.sina.com.cn/ishou ...
- 基于python的接口测试框架设计(二)配置一些参数及文件
基于python的接口测试框架设计(二)配置一些参数及文件 我这里需要基于我的项目配置的主要是登陆参数.以及baseURL ,把这些放在单独的文件里 毕竟导入的时候方便了一些 首先是url 图略 建 ...
- 一次完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试
Web登录测试是很常见的测试!手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文作者就用python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动 ...
- Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)
Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...
- python+selenium+unnittest框架
python+selenium+unnittest框架,以百度搜索为例,做了一个简单的框架,先看一下整个项目目录结构 我用的是pycharm工具,我觉得这个工具是天使,超好用也超好看! 这些要感谢原作 ...
- 一次简单完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试
Web登录测试是很常见的测试,手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文就基于python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化 ...
- 基于python的接口测试框架设计(三)接口测试的框架
基于python的接口测试框架设计(三)接口测试的框架 其实我这里用到的是unittest单元测试框架,,这个框架好就好在比较清楚,,setup terdown都可以处理一些初始化及完成后的工作 主要 ...
- 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码
引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...
随机推荐
- android在linux下刷机
只需要下载相应的zip包,不需装什么手机助手. 1.下载相应zip包(ROM) http://download.mokeedev.com/ 比如我在上述网站下的魔趣的对应机型的ROM包. 2.linu ...
- 关于 warning CS0659:“***”重写Object.Equals(object o)但不重写Object.GetHashCode()
对象相等性和同一性 System.Object 类型提供了以下方法, namespace System { // // 摘要: // 支持 .NET Framework 类层次结构中的所有类,并为派生 ...
- Oracle11gR2-聚簇因子浅析
创建表t1,t2 SQL> conn n1/n1 Connected. SQL> SQL> SQL> create table t1 as select trunc(rownu ...
- Elasticsearch-2.4.3的3节点安装(多种方式图文详解)(含 head、kopf、marvel、shield和watcher插件安装和使用)
前提: Elasticsearch-2.4.3的下载(图文详解) Elasticsearch-2.4.3的单节点安装(多种方式图文详解) 我这里,以192.168.80.10(HadoopMaster ...
- Echarts在java中使用
index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...
- 前端开发之JavaScript HTML DOM理论篇二
主要内容: 1.HTML DOM元素 2.HTML DOM事件 一.DOM元素 主要操作有添加.删除和替换HTML元素 1.创建新的HTML元素 (1)方法一: appendChild() 追加 如 ...
- MySQL内置功能之视图、触发器和存储过程
主要内容: 一.视图 二.触发器 三.存储过程 1️⃣ 视图 一.关于视图的理解 1.1.何谓视图? 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名], 用户使 ...
- Perl 变量:哈希变量
Perl 哈希变量哈希是 key/value 对的集合.Perl中哈希变量以百分号 (%) 标记开始.访问哈希元素格式:${key}. 1.创建哈希创建哈希可以通过以下两种方式: 1.为每个 key ...
- 275. H-Index II 递增排序后的论文引用量
[抄题]: Given an array of citations in ascending order (each citation is a non-negative integer) of a ...
- 关于HDFS默认block块大小
这是有疑惑的一个问题,因为在董西成的<Hadoop技术内幕--深入解析MapReduce架构设计与实现原理>中提到这个值是64M,而<Hadoop权威指南>中却说是128M,到 ...