treelist自动定位行_Android自动化测试26--Excel

5d533f666aa6db080110b25979e443dd.png

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,内容如下:

a4188fbed0bdbcc1c8b5891f8b4b9f1a.png
  1. 打开excel文件获取所有sheet

实例:

import xlrd
if __name__ == '__main__':
    workbook = xlrd.open_workbook(r'movie.xls')
    print(workbook.sheet_names())
  1. 根据下标获取sheet名称

实例:

import xlrd
if __name__ == '__main__':
    workbook = xlrd.open_workbook(r'movie.xls')
    sheet_name = workbook.sheet_names()[0]
    print(sheet_name)
  1. 根据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("#$$$$$$$$$$$$$$$$$$$$$$$$$$$#")
  1. 根据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) # 输出第二列所有的数据
  1. 获取指定单元格的内容

实例:

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列所有的数据
  1. 获取单元格内容的数据类型

实例:

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内容同上:

a4188fbed0bdbcc1c8b5891f8b4b9f1a.png
  1. 打开excel文件获取所有sheet

实例:

from openpyxl import load_workbook
if __name__ == '__main__':
    wb = load_workbook(r"movie.xlsx")
    print(wb.sheetnames)    # ['Sheet1', 'Sheet2', 'Sheet3']
  1. 根据下标获取sheet名称

实例:

from openpyxl import load_workbook
if __name__ == '__main__':
    wb = load_workbook(r" movie.xlsx")
      print(wb.sheetnames[0])    # 获取sheet1
  1. 根据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) #输出存在数据的列数
  1. 获取指定单元格的内容

实例:

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”:

048c103205e76c6bf64944ea3530371c.png

通过读取刚刚完成的“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文件的第四列,如果不一致就空白。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值