Android自动化测试26
转帖请注明出处!谢谢
Excel
自动化测试过程中会经常用到Excel作为外部存储的数据源,数据驱动也好关键字数据驱动也好都会用到读取excel数据,同时写入excel类型的测试报告等等。python操作excel文件的第三方类库有xlrd(同族:xlwt负责写excel)和openpylx,xlsxwriter。其中xlrd可以实现跨平台读Microsoft Excel文件。它不是借助win2com类库的COM技术来访问Excel,而是直接分析Excel文件格式,从中解析数据。因此它支持python解析任何平台上的excel文件。它对unicode支持的很好,但是由于无法像微软公司那样熟悉excel文件格式的程度,所以不能处理图表,宏,图片等嵌入对象,VBA模块,公式,注释,链接等数据类型。现在它支持的Excel版本:2004, 2003, XP, 2000, 97, 95, 5.0, 4.0, 3.0, 2.1, 2.0。而2007版本Excel出现了xlsx文件类型,目的是使Excel能存入超过65535行数据。对于2007以后版本的excel文件用openpyxl库处理,支持Python3.x。还有一个库xlsxwriter 是python用来构造xlsx文件的模块,可以向excel2007+中写text,numbers,formulas 公式以及hyperlinks超链接,合并单元格,制作excel图表等功能。注意xlsxwriter只能创建新文件,不可以修改原有文件。如果创建新文件时与原有文件同名,则会覆盖原有文件
由于以上都是第三方库,要在使用前用python的pip命令安装,在命令符窗口中执行以下命令:
pip install xlrd
pip install xlwt
pip install openpyxl
xlrd和xlwt
测试使用excel文档名称为movie.xls,内容如下:
- 打开excel文件获取所有sheet
实例:
import xlrd
if __name__ == '__main__':
workbook = xlrd.open_workbook(r'movie.xls')
print(workbook.sheet_names())
- 根据下标获取sheet名称
实例:
import xlrd
if __name__ == '__main__':
workbook = xlrd.open_workbook(r'movie.xls')
sheet_name = workbook.sheet_names()[0]
print(sheet_name)
- 根据sheet索引(或名称)获取有数据的行和列数
实例:
import xlrd
if __name__ == '__main__':
workbook = xlrd.open_workbook(r' movie.xls ')
print("#$$$$$$$$$$$$$$$$$$$$$$$$$$$#")
sheet_name = workbook.sheet_by_index(0) #通过索引获取数据
print(sheet_name.name) #sheet名称
print('行数:'+ str(sheet_name.nrows)) #sheet已经写入的数据行数
print('列数:'+str(sheet_name.ncols)) #sheet已经写入的数据列数
print("#$$$$$$$$$$$$$$$$$$$$$$$$$$$#")
sheet_name = workbook.sheet_by_name('Sheet1') #通过名称获取数据
print(sheet_name.name) # sheet名称
print('行数:' + str(sheet_name.nrows)) # sheet已经写入的数据行数
print('列数:' + str(sheet_name.ncols)) # sheet已经写入的数据列数
print("#$$$$$$$$$$$$$$$$$$$$$$$$$$$#")
- 根据sheet名称获取整行和整列的值
实例:
import xlrd
if __name__ == '__main__':
workbook = xlrd.open_workbook(r' movie.xls ')
sheet_name = workbook.sheet_by_index(0) #通过索引获取sheet
print(sheet_name.name) #sheet名称
rows = sheet_name.row_values(3)
cols = sheet_name.col_values(2)
print(rows) # 输出第三行所有的数据
print(cols) # 输出第二列所有的数据
- 获取指定单元格的内容
实例:
import xlrd
if __name__ == '__main__':
workbook = xlrd.open_workbook(r' movie.xls ')
sheet_name = workbook.sheet_by_index(0) #通过索引获取数据
print(sheet_name.name) #sheet名称
rows1 = sheet_name.cell(1,0)
rows2 = sheet_name.cell(3,4)
print(rows1) # 输出1行0列的数据
print(rows2) # 输出3行4列所有的数据
- 获取单元格内容的数据类型
实例:
import xlrd
if __name__ == '__main__':
workbook = xlrd.open_workbook(r'movie.xls')
sheet_name = workbook.sheet_by_index(0) #通过索引获取数据
print(sheet_name.name) #sheet名称
rows_type = sheet_name.cell(1,0).ctype
print(rows_type) # 输出1行0列的数据类型
说明:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
openpyxl
openpyxl主要用到三个概念:Workbooks,Sheets,Cells。Workbook就是一个excel工作表;Sheet是工作表中的一张表页;Cell就是简单的一个格。openpyxl就是围绕着这三个概念进行的,不管读写都是“三板斧”:打开Workbook,定位Sheet,操作Cell。操作movie.xlsx内容同上:
- 打开excel文件获取所有sheet
实例:
from openpyxl import load_workbook
if __name__ == '__main__':
wb = load_workbook(r"movie.xlsx")
print(wb.sheetnames) # ['Sheet1', 'Sheet2', 'Sheet3']
- 根据下标获取sheet名称
实例:
from openpyxl import load_workbook
if __name__ == '__main__':
wb = load_workbook(r" movie.xlsx")
print(wb.sheetnames[0]) # 获取sheet1
- 根据sheet索引(或名称)获取写入数据的行数和列数
实例:
from openpyxl import load_workbook
if __name__ == '__main__':
wb = load_workbook(r"C: movie.xlsx")
sheetnames = wb.get_sheet_names()
ws = wb.get_sheet_by_name(sheetnames[0])
print(ws.max_row) #输出存在数据的行数
print(ws.max_column) #输出存在数据的列数
- 获取指定单元格的内容
实例:
from openpyxl import load_workbook
if __name__ == '__main__':
wb = load_workbook(r"C: movie.xlsx")
sheetnames = wb.get_sheet_names()
ws = wb.get_sheet_by_name(sheetnames[0])
wvalue = ws.cell(row=2, column=1).value
print(wvalue) #输出制定cell表格的内容
综合实例
以测试Android为例,用excel文件为数据源,实现Appium数据驱动。
准备测试数据文档
准备测试android计算器的测试数据,请使用MS Office软件或其他类似软件打开一个Excel文件,输入下面内容并保存为“test_data.xlsx”:
通过读取刚刚完成的“test_data.xlsx”表格中的定位器来定位Android手机自带的计算器中对应的按钮,定位成功后点击该按钮,并且将每一条的执行结果记录在这份表格中的最后一列测试结果。
编写测试代码
testCal.py代码如下:
#coding=utf-8
import xlrd,xlwt
from xlutils.copy import copy
import time
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android' # 设备系统
desired_caps['platformVersion'] = '6.0' # 设备系统版本
desired_caps['deviceName'] = 'emulator-5554' # 设备名称
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'
driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
time.sleep(3)
#写入数据
def writeData(j,r,rvValue=None):
mybook = xlrd.open_workbook("C:UserspclDesktopMyTestData.xlsx")
wrbook = copy(mybook)
wsheet = wrbook.get_sheet(0)
wsheet.write(j, r, rvValue)
wrbook.save("C:UserspclDesktopMyTestData.xlsx")
#读取测试数据
def readTestData():
fname = "C:UserspclDesktopMyTestData.xlsx"
bk = xlrd.open_workbook(fname)
sh = bk.sheet_by_name("myData")
#获取行数
nrows = sh.nrows
# 获取列数
ncols = sh.ncols
print("nrows %d, ncols %d" % (nrows,ncols))
#获取第一行第一列数据
for i in range(1,nrows):
cell_value = sh.cell_value(i,0)
time.sleep(2)
el = driver.find_element_by_id(cell_value)
el.click()
time.sleep(3)
writeData(i,2,el.text)
data1 = str((sh.cell_value(i, 1)))
if data1 == el.text:
#写入数据
writeData(i,3,"pass")
readTestData()
技术解释:上面这段代码首先导入了xlrd和xlwt模块,也导入appium相关的模块,接下来代码appium配置需要启动的相关设置,然后启动被测应用。通过封装的readTestData的方法来读取Excel表格数据,用for循环来遍历每一行测试数据,这里注意要排除掉第一行数据(也就是标题行)。在for循环内部读取测试数据驱动测试执行,然后将执行测试结果和表格内的预期结果进行比对,如果对比一致就写入excel文件的第四列,如果不一致就空白。