场景:要循环界面Table数据源与导出Excel数据源作对比。

说明: List<HashMap<String,String>>

    List中每一项都是一个HashMap

HashMap<String,String> map中 key是一个String,value也是一个String

一: 如何定位界面Table 一整行的定位。

XPath写法示例://table[contains(@class,'condensed')][contains(@style,'margin-bottom')]/tbody/tr

注意事项:要确保定位只能匹配唯一的Code

二: Feature 示例:

  Scenario: E-1342:休假结余设立导出,跟菜单显示一致
When I click on menu 时间管理>休假结余>休假结余设立 from HCM page
#Then I select leaveCode for NAL|SL2|OL|
Then I advance search staff no 0001
Then I select leaveCode for NAL
Then I click export button leave Banlance
Then verify the export Excel Data compare with Interface table

三 :Step 示例:

@Then("^verify the export Excel Data compare with Interface table$")
public void verify_the_export_Excel_Data_compare_with_Interface_table() throws Exception {
List<HashMap<String, String>> previewData = vp.getLeaveBanlaceList(); //获取Table数据源集合
String fileName = anp.downloadFile();
vp.verifyExportExcelDataCompareWithInterfaceTable(fileName, previewData);
}

四、Page 示例

         /**
* 用于休假结余设立菜单,返回页面的List<LinkedHashMap>
* @return
* @throws Exception
*/
public List<HashMap<String, String>> getLeaveBanlaceList() throws Exception {
List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
List<WebElement> trList = findAll(By.xpath("//table[contains(@class,'condensed')]/tbody/tr"));
for (int i = 1; i<trList.size(); i++) {
String trRowXpath = "//table[contains(@class,'condensed')][contains(@style,'margin-bottom')]/tbody/tr["+ i +"]";
LinkedHashMap<String, String> dataOneRow = getRowLeaveBanlanceData(trRowXpath);
data.add(dataOneRow);
}
return data;
}
调用getRowLeaveBanlanceData方法,得到LinkedHashMap
 public LinkedHashMap<String, String> getRowLeaveBanlanceData(String trRowXpath) throws Exception {
waitLoading();
LinkedHashMap<String, String> actualData = new LinkedHashMap<String, String>();
List<WebElement> headers = waitFor(By.xpath(trRowXpath + "/../../thead/tr/td"));
List<WebElement> values = waitFor(By.xpath(trRowXpath + "/td"));
for (int i = 1 ; i < headers.size(); i++) {
if (!headers.get(i).getText().trim().isEmpty()) {
actualData.put(headers.get(i).getText().trim(), values.get(i).getText().trim());
}
}
return actualData;
}

输出结果:{员工工号=0001, 姓名=黄明, 休假代码=NAL, 休假名称=年假, 上年结余=0, 本年享有=96, 本年调整=0, 下年享有=96, 下年调整=0, 合共已用=0, 备注=}

 

如何使用List<HashMap<String, String>>详细讲解的更多相关文章

  1. Java堆、栈和常量池以及相关String的详细讲解(经典中的经典) (转)

    原文链接 : http://www.cnblogs.com/xiohao/p/4296088.html 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的 ...

  2. Java堆、栈和常量池以及相关String的详细讲解

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  3. Java堆、栈和常量池以及相关String的详细讲解(转)

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  4. Java: 分解List<HashMap<String, String>>

    分解List<HashMap<String, String>> 的方法: List<HashMap<String, String>> mapList; ...

  5. 将ArrayList<HashMap<String, String>>转为ArrayList<Bundle>类型的解决方案

    Bundle是一种利用键值对存储的数据格式,而我们在程序中通常利用HashMap存储数据.在开发中,通过Http请求得到JSONArray类型的返回值,我选择利用ArrayList<HashMa ...

  6. 初始化集合的花样new HashMap<String, String>{ {put("str1":"abc");} }(转)

    Map集合的普通初始化方法: Map<String, String> map = new HashMap<String, String>(); map.put("Na ...

  7. List<HashMap<String,String>> list, 根据hashmap中的某个键的值排序

    来源https://blog.51cto.com/zhaodan/1725249 //可以使用Collections.sort(List list, Comparator c)来实现 这里举例hash ...

  8. Ruby字符串(2):String方法详细整理

    String方法整理 官方手册 类方法 new new(str="") → new_str new(str="", encoding: enc) → new_s ...

  9. Android webservice的用法详细讲解

    Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...

随机推荐

  1. 解决SQLite异常:library routine called out of sequence

    在项目开发中,使用SQLite一不小心就会碰到各种DB异常,网上搜了下没有这方面的资料,写出来记录下. 异常信息:android.database.sqlite.SQLiteMisuseExcepti ...

  2. java.util.concurrent介绍【转】

    java.util.concurrent介绍   java.util.concurrent 包含许多线程安全.测试良好.高性能的并发构建块.不客气地说,创建 java.util.concurrent ...

  3. 如何使用ABBYY FineReader 12将JPEG文件转换成可编辑文本

    日常工作中,经常会收到一些JPEG格式的图像文件,有时候还需要做一些修改,可是大家都知道JPEG格式的文件是无法修改的,必须转换成可编辑的格式,当然,现在市场上也应用而生了很多转换工具,相信大家都听说 ...

  4. 设计模式-行为型模式,python 中介者模式

    中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行 ...

  5. 机器人学 —— 轨迹规划(Artificial Potential)

    今天终于完成了机器人轨迹规划的最后一次课了,拜拜自带B - BOX 的 Prof. TJ Taylor. 最后一节课的内容是利用势场来进行轨迹规划.此方法的思路非常清晰,针对Configration ...

  6. day_5.07py

    正则:

  7. H - Farey Sequence

    The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/ ...

  8. 拦截$.ajax方法实现登录过期登录

    jQuery(function ($) { var CreateLoginWindows = function (callback) { var h = 300; $('#CreateLoginWin ...

  9. MVC 二级联动

    后台代码,获取数据如下: /// <summary> /// 获取省份 /// </summary> public JsonResult GetProvincelist() { ...

  10. .NET Core开发日志——HttpContext

    之前的文章记述了从ASP.NET Core Module到KestrelServer的请求处理过程.现在该聊聊如何生成ASP.NET中我们所熟悉的HttpContext. 当KestrelServer ...