基于Java+Selenium的WebUI自动化测试框架(十二)-----读取Excel文件(POI)(2)
上一篇我们讲了怎么利用Java的反射机制,将Excel的读取到的数据,赋值给我们构造函数中定义的变量。
接下来就简单了,我们将实际实现这个读取的简单过程。来看下面一段代码。
private static <T> List<T> transToObject(Class<T> clz,Workbook xssfWorkbook, String sheetName)
throws InstantiationException, IllegalAccessException,
InvocationTargetException {
List<T> list = new ArrayList<T>();
Sheet xssfSheet = xssfWorkbook.getSheet(sheetName);
Row firstRow = xssfSheet.getRow(0);
if(null ==firstRow){
return list;
}
List<Object> heads = getRow(firstRow);
//添加sheetName字段,用于封装至bean中,与bean中的字段相匹配。
heads.add("sheetName");
Map<String, Method> headMethod = getSetMethod(clz, heads);
for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
try {
Row xssfRow = xssfSheet.getRow(rowNum);
if (xssfRow == null) {
continue;
}
T t = clz.newInstance();
List<Object> data = getRow(xssfRow);
//如果发现表数据的列数小于表头的列数,则自动填充为null,最后一位不动,用于添加sheetName数据
while(data.size()+1<heads.size()){
data.add("");
}
data.add(sheetName);
setValue(t, data, heads, headMethod);
list.add(t);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
在这段代码中,我们使用了一个泛型Class<T>来指代我们的构造类,返回的就是一个包含这个构造类的实例集合List<T>。
另外,xssfWorkbook 是POI中指代一个Excel workbook的变量,sheetName就是我们要读取的sheet名字。
这里使用了一个小技巧,就是我们的构造函数中,并没有包含sheetName这样一个变量,但是我们实际读取Excel的时候,每个被读取的值都是在一个sheet上的,这样也就必然会有一个sheetName的属性。我们获取第一列的列名之后,可以把“sheetName”这个字段加入List集合中。
在赋值的时候,我们把参数当中的sheetName赋值给“sheetName”字段,这样,作为一个返回的构造类实例,就包含了变量“sheetName”及具体值sheetName。
下面,我们再对xssfWorkbook进行再定义,请看下面一段代码:
public static <T> List<T> readExcel(Class<T> clz, String path,String sheetName) {
if (null == path || "".equals(path)) {
return null;
}
InputStream is;
Workbook xssfWorkbook;
try {
is = new FileInputStream(path);
//判断Excel的版本。因为Excel版本不一样,文件的后缀名也不一样
if (path.endsWith(".xls")) {
xssfWorkbook = new HSSFWorkbook(is);
} else {
xssfWorkbook = new XSSFWorkbook(is);
}
is.close();
return transToObject(clz, xssfWorkbook, sheetName);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("转换excel文件失败:" + e.getMessage());
}
}
这样,我们就完成了一个自定义的构造类----“按需读取”Excel的过程。
在这个过程中,我们需要注意:构造类中的变量名和Excel文件中记录的列名要保持一致,我们才能正常读取数据。
扩展一下,假如我要读取Excel和N个sheet上的数据,并且也要“按需读取”。怎么办呢。例如:
Excel有2个Sheet,SheetA和SheetB,这两页上分别写有不同的元素,我想把这些页面元素的内容都读出来,作为一个集合List<T>返回
SheetA------页面元素A1(网页名,名称,寻找方式,等待时间,路径),SheetA------页面元素A2(网页名,名称,寻找方式,等待时间,路径)
SheetB------页面元素B1(网页名,名称,寻找方式,等待时间,路径),SheetB------页面元素B2(网页名,名称,寻找方式,等待时间,路径)
我们来看下面一段代码:
public static <T> List<T> readExcel(Class<T> clz, String path) {
System.out.println(path);
if (null == path || "".equals(path)) {
return null;
}
InputStream is;
Workbook xssfWorkbook;
try {
is = new FileInputStream(path);
if (path.endsWith(".xls")) {
xssfWorkbook = new HSSFWorkbook(is);
} else {
xssfWorkbook = new XSSFWorkbook(is);
}
is.close();
int sheetNumber = xssfWorkbook.getNumberOfSheets();
List<T> allData = new ArrayList<T>();
for (int i = 0; i < sheetNumber; i++) {
allData.addAll(transToObject(clz, xssfWorkbook,
xssfWorkbook.getSheetName(i)));
}
return allData;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("转换excel文件失败:" + e.getMessage());
}
}
这里还是比较好处理的,只要直接遍历每个Sheet再存储就好了。
实际使用例子:
public static void main(String[] args) {
String excelpath = ".\\case-data\\same4Test.xls";
List<positionBean> dataList = new ArrayList<positionBean>();
dataList = excelUtil.readExcel(positionBean.class,excelpath,"Sheet1");
for(int i = 0; i < dataList.size();i++) {
String pageName = dataList.get(i).getPageName();
String path = dataList.get(i).getPath();
int waitSec = dataList.get(i).getSec();
String type = dataList.get(i).getType();
String positionName = dataList.get(i).getPositionName();
System.out.println(pageName);
System.out.println(path);
System.out.println(waitSec);
System.out.println(type);
System.out.println(positionName);
}
}
这样我们就真正完成了使用POI实现“按需读取”
基于Java+Selenium的WebUI自动化测试框架(十二)-----读取Excel文件(POI)(2)的更多相关文章
- 基于Java+Selenium的WebUI自动化测试框架(二)-----页面操作接口
在有了基础的Position类之后,我们需要考虑我们在寻找完页面元素之后,需要做什么.这个“做”什么,可以理解为我们在页面上需要对应的一系列动作.比如:点击,输入,切换窗口,寻找元素,判断元素是否存在 ...
- 基于Java+Selenium的WebUI自动化测试框架(十四)-----使用TestNG的Sample
到目前为止,我们所写的东西,都是集中在如何使用Selenium和Java来定位和读取元素.那么,到底如何具体开展测试,如何实现参数化,如何实现判定呢?下面,我们来看看Java应用程序的测试框架吧. 当 ...
- 基于Java+Selenium的WebUI自动化测试框架(十)-----读取Excel文件(JXL)
之前,我们使用了读取XML文件的方式来实现页面元素的读取,并做成了基础页面类.下面,我们来进行一些扩展,通过Excel来读取页面元素. Excel的使用,大多数人应该都不陌生.那么Java读取Exce ...
- 基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器
对于自动化测试,尤其是UI的自动化测试.是很多做黑盒功能测试的同学,入门自动化测试一个最为直观的或者说最容易理解的途径之一. 对于手工测试和自动化测试的优劣,网上有很多论述,在这里不作展开讨论.但是, ...
- 基于Java+Selenium的WebUI自动化测试框架(八)-----读取元素(XML文件)
我们继续回到自动化测试框架的主线上来,在前面的文章中,我们定义一个页面元素的主要参数有:路径,找寻方式,等待时间,名称,这个四个参数.另外,我们还需要考虑一个问题,就是网站的页面. 举个例子来说,如果 ...
- 基于Java+Selenium的WebUI自动化测试框架(六)---浏览器初始化
本篇我们来讨论,如何写一个浏览器初始化的类.在写之前,先思考一下,我们需要一个什么样的初始化? 先来看看使用原生的Java + selenium是怎么做的.(以firefox为例) System.se ...
- 基于Java+Selenium的WebUI自动化测试框架(九)-----基础页面类(BasePage)
上篇我们写了java读取xml文件的类,实现了可以从xml文件读取元素的方式.那么,接下来我们需要考虑一个问题.我们拿了这些元素之后怎么去操作呢? 先来看看我们手工测试的时候是怎么进行的. 双击浏览器 ...
- 基于Java+Selenium的WebUI自动化测试框架(十一)-----读取Excel文件(POI)(1)
上一篇说了利用JXL的jar包来读取Excel的代码.在Java中,还可以用另外一种jar包来读取Excel的内容,那就是Apache的POI. 这里和之前一样,需要导入POI的jar包,建议导入这三 ...
- 基于Java+Selenium的WebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)
前面,我们讲了如何使用POI进行Excel的“按需读取”.根据前面我们写的BasePageX,我们可以很轻松的写出来基于这个“按需读取”的BasePage. package webui.xUtils; ...
随机推荐
- TestDirector(TD)—测试管理工具
简介 TestDirector是全球最大的软件测试工具提供商Mercury Interactive公司生产的企业级测试管理工具,也是业界第一个基于Web的测试管理系统,它可以在您公司内部或外部进行全球 ...
- django:资源网站汇总
Django REST framework官网 http://www.sinodocs.cn/ django中文网 https://www.django.cn/
- c#通过socket判断服务器连接是否正常
判断Socket是否连接上,需要通过发包来确认. 之前确认都是调用调用socket的connected属性,然而该属性是上次的连接是否成功的结果,不及时. // 检查一个Socket是否可连接 pri ...
- Influx Sql系列教程六:insert 修改数据
在influxdb中没有专门的修改数据的update语句,对于influxdb而言,如果想修改数据,还是得使用我们前面的说到的insert来实现,那么怎么判断一条insert语句是插入还是修改呢? 1 ...
- 05 javascript知识点---BOM和DOM
1.DOM简单学习(为了满足案例要求) 功能:控制html文档的内容获取页面标签(元素)对象:Element document.getElementById("id值"):通过元素 ...
- 用海豚框架(DolphinPHP)实现单/多图片上传时,如何获得图片路径
用框架实现图片上传很简单,就不多说了,然后这个框架的实现机制是这样的,我们选择图片,点击上传,他会将图片保存在uploads下,以当天时间和随机字母作为图片名,然后在返回个数字,这个数字是这个图片的i ...
- python列表生成式、键盘输入及类型转换、字符串翻转、字母大小写、数组广播、循环语句等基础问题
Python知识总结 1.列表生成式 在实际开发过程中,当需要获取一个连续列表时,可直接使用range(3,10),但是如果获取该列表中每个数据的平方时,通常可以通过for循环来解决这个问题,如下 ...
- 17.Python略有小成(包,logging模块)
Python(包,logging模块) 一.包 什么是包 官网解释 : 包是一种通过使用'.模块名'来组织python模块名称空间的方式 , 具体来讲 , 包就是一个包含有__ init __.py文 ...
- 在springMVC的controller中获取request,response对象的一个方法
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttr ...
- Kafka 初识
1.Kafka 是什么? 用一句话概括一下:Apache Kafka 是一款开源的消息引擎系统. 倘若“消息引擎系统“这个词对你来说有点陌生的话,那么“消息队列“.“消息中间件”的提法想必你一定是有所 ...