基于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; ...
随机推荐
- SVN限制普通用户删除文件及提交时必须填写log日志
SVN用得也算挺广泛的,但是它也存在着一个大问题,就是权限控制得比较差,要么读,要么读写,而读写就意外着可以删除文件(目前我的理解是这样,如果有什么不对的地方,请多指教). 刚好前段时间发生了开发人员 ...
- GitLab - 一些基础使用
1 - GitLab角色权限 1.1 组(同一组成员的行为权限) 管理员创建不同的分组,然后设定分组的负责人(Owner) Owner可以添加组员,为组创建项目,指定项目的负责人 项目负责人可以添加项 ...
- rabbitmq设置消息优先级、队列优先级配置
1.首先在consume之前声明队列的时候,要加上x-max-priority属性,一般为0-255,大于255出错 -----配置队列优先级 配置成功后rabbitmq显示: 2.在向exchan ...
- Android中的数据结构
数据结构在Android中也有着大量的运用,这里采用数据结构与源代码分析相结合,来认识Android的数据结构 线性表 线性表可分为顺序存储结构和链式存储结构 顺序存储结构-ArrayList 通过对 ...
- svn 版本控制搭建
1.安装SVN yum install subversion 2.开启服务 systemctl start svnserve.service 3.创建仓库 svnadmin create /opt/s ...
- jquery鼠标经过弹出层写法
jquery鼠标经过弹出层写法<pre><div class="navitem"><a href="/index.php?c=news&am ...
- Qt信号-槽原理剖析--(1)信号槽简介
唯有创造才是快乐.只有创造的生灵才是生灵.--罗曼·罗兰 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察者, ...
- 爬虫请求库之requests库
一.介绍 介绍:使用requests可以模拟浏览器的请求,比之前的urllib库使用更加方便 注意:requests库发送请求将网页内容下载下来之后,并不会执行js代码,这需要我们自己分析目标站点然后 ...
- xorm -Find方法实例
查询多条数据使用Find方法,Find方法的第一个参数为slice的指针或Map指针,即为查询后返回的结果,第二个参数可选,为查询的条件struct的指针. package main import ( ...
- logrus 剖析之 hook
logrus 通过实现 Hook接口扩展 hook 机制,可以根据需求将日志分发到任意的存储介质, 比如 es, mq 或者监控报警系统,及时获取异常日志.可以说极大的提高了日志系统的可扩展性. ho ...