Selenium Webdriver - 通过 excel sheet 按 header 名称传递批量数据 - 超过 50 个表单字段
Selenium Webdriver - passing bulk data with excel sheet by header name- more than 50 fields of form
我正在寻找一些解决方案,我想将 100 条记录传递到我拥有 50 多个字段的表单。我对 testNG 数据提供者做了一些研究,但它看起来 returns 只有字符串,所以我觉得与数据提供者一起使用是不可行的,就好像将 50 个字符串参数传递给特定函数一样不好。我还做了一些研究来读取 excel 文件,我得到了两种方法,我可以使用 jxl 或 Apache poi,但是我也无法通过列 header 读取数据如果我不能使用方法的行号和列号,因为我有太多需要处理的字段。其背后的原因是,将来如果一个字段添加到单一表单中,它将被返工,这又是不可行的。
我一直在关注这个link:
http://www.softwaretestinghelp.com/selenium-framework-design-selenium-tutorial-21/
用于按列读取数据,但无论如何我都无法根据列 header 获取记录。我们还有其他方法可以实现吗?
谢谢
"testNG data providers but it looks like that it returns only strings" - 不正确。它允许您 return 类型 Object 的多维数组。你创造什么样的object就是你自己的代码。您可以选择从 excel 中读取,将所有字段封装在一个 object(您自己的 pojo)或多个 object 中,然后方法参数可以只包含那些 object 声明的类型而不是 50 个字符串。
jxl 和 poi 都是与 excel 交互的库。如果您想与 excel 进行特定的交互,例如基于 header 的阅读,那么您需要为此编写代码 - 它不是开箱即用的。
如果您担心再添加一列,那么首先通过读取 header 列来构建您的索引,然后将其放入相关的数据结构中,然后继续读取您的数据。
我终于在apache poi的帮助下实现了。我创建了集中式函数,该函数返回以标题为索引的哈希图。
这是该函数:
这是我的主要测试函数:
@Test(dataProvider="dpCreateNewCust")
public void createNewCustomer(List<Map<String, String>> sheetList){
try{
//Step 2. Login
UtilityMethods.SignIn();
for(Map<String, String> map : sheetList){
//Step 3. New Customer
if(map.get("Testcase").equals("Yes"))
{
//Process with excel data
ProcessNewCustomer(map);
}
}
}
catch(InterruptedException e)
{
System.out.println ("Login Exception Raised: <br> The exception get caught" + e);
}
}
//My data provider
@DataProvider(name = "dpCreateNewCust")
public Object[][] dpCreateNewCust(){
XLSfilename = System.getProperty("user.dir")+"//src//watts//XLSFiles//testcust.xlsx";
List<Map<String, String>> arrayObject = UtilityMethods.getXLSData(XLSfilename,Sheetname));
return new Object[][] { {arrayObject } };
}
//----GetXLSData Method in UtilityMethods Class :
public static List<Map<String, String>> getXLSData(String filename, String sheetname)
{
List<String> titleList = new ArrayList<String>();
List<Map<String, String>> sheetList = new ArrayList<Map<String, String>>();
try {
FileInputStream file = new FileInputStream(filename);
//Get the workbook instance for XLS file
XSSFWorkbook XLSbook = new XSSFWorkbook(file);
//Get first sheet from the workbook
//HSSFSheet sheet = workbook.getSheetAt(0);
WorkSheet = XLSbook.getSheet(sheetname);
//Iterate through each rows from first sheet
int i = 0;
Iterator<Row> rowIterator = WorkSheet.iterator();
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
//For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
int j = 0;
Map<String, String> valueMap = new HashMap<>();
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
if(i==0){
titleList.add(cell.getStringCellValue());
}
else
{
String cellval = "";
switch(cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
cellval = cell.getBooleanCellValue()+"";
break;
case Cell.CELL_TYPE_NUMERIC:
cellval = String.valueOf(cell.getNumericCellValue())+"";
break;
case Cell.CELL_TYPE_STRING:
cellval = cell.getStringCellValue();
break;
default:
break;
}
if(cellval!="")
{
valueMap.put(titleList.get(j), cellval); valueMap.put("ResultRow",String.valueOf(row.getRowNum()));
valueMap.put("ResultCol",String.valueOf(0));
}
}
j++;
}
if(i!=0 && !valueMap.isEmpty()){
//System.out.println(valueMap);
sheetList.add(valueMap);
}
i++;
}
//System.out.println(sheetList); System.exit(0);
file.close();
XLSbook.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sheetList;
}
我正在寻找一些解决方案,我想将 100 条记录传递到我拥有 50 多个字段的表单。我对 testNG 数据提供者做了一些研究,但它看起来 returns 只有字符串,所以我觉得与数据提供者一起使用是不可行的,就好像将 50 个字符串参数传递给特定函数一样不好。我还做了一些研究来读取 excel 文件,我得到了两种方法,我可以使用 jxl 或 Apache poi,但是我也无法通过列 header 读取数据如果我不能使用方法的行号和列号,因为我有太多需要处理的字段。其背后的原因是,将来如果一个字段添加到单一表单中,它将被返工,这又是不可行的。
我一直在关注这个link: http://www.softwaretestinghelp.com/selenium-framework-design-selenium-tutorial-21/
用于按列读取数据,但无论如何我都无法根据列 header 获取记录。我们还有其他方法可以实现吗?
谢谢
"testNG data providers but it looks like that it returns only strings" - 不正确。它允许您 return 类型 Object 的多维数组。你创造什么样的object就是你自己的代码。您可以选择从 excel 中读取,将所有字段封装在一个 object(您自己的 pojo)或多个 object 中,然后方法参数可以只包含那些 object 声明的类型而不是 50 个字符串。
jxl 和 poi 都是与 excel 交互的库。如果您想与 excel 进行特定的交互,例如基于 header 的阅读,那么您需要为此编写代码 - 它不是开箱即用的。 如果您担心再添加一列,那么首先通过读取 header 列来构建您的索引,然后将其放入相关的数据结构中,然后继续读取您的数据。
我终于在apache poi的帮助下实现了。我创建了集中式函数,该函数返回以标题为索引的哈希图。 这是该函数:
这是我的主要测试函数:
@Test(dataProvider="dpCreateNewCust")
public void createNewCustomer(List<Map<String, String>> sheetList){
try{
//Step 2. Login
UtilityMethods.SignIn();
for(Map<String, String> map : sheetList){
//Step 3. New Customer
if(map.get("Testcase").equals("Yes"))
{
//Process with excel data
ProcessNewCustomer(map);
}
}
}
catch(InterruptedException e)
{
System.out.println ("Login Exception Raised: <br> The exception get caught" + e);
}
}
//My data provider
@DataProvider(name = "dpCreateNewCust")
public Object[][] dpCreateNewCust(){
XLSfilename = System.getProperty("user.dir")+"//src//watts//XLSFiles//testcust.xlsx";
List<Map<String, String>> arrayObject = UtilityMethods.getXLSData(XLSfilename,Sheetname));
return new Object[][] { {arrayObject } };
}
//----GetXLSData Method in UtilityMethods Class :
public static List<Map<String, String>> getXLSData(String filename, String sheetname)
{
List<String> titleList = new ArrayList<String>();
List<Map<String, String>> sheetList = new ArrayList<Map<String, String>>();
try {
FileInputStream file = new FileInputStream(filename);
//Get the workbook instance for XLS file
XSSFWorkbook XLSbook = new XSSFWorkbook(file);
//Get first sheet from the workbook
//HSSFSheet sheet = workbook.getSheetAt(0);
WorkSheet = XLSbook.getSheet(sheetname);
//Iterate through each rows from first sheet
int i = 0;
Iterator<Row> rowIterator = WorkSheet.iterator();
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
//For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
int j = 0;
Map<String, String> valueMap = new HashMap<>();
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
if(i==0){
titleList.add(cell.getStringCellValue());
}
else
{
String cellval = "";
switch(cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
cellval = cell.getBooleanCellValue()+"";
break;
case Cell.CELL_TYPE_NUMERIC:
cellval = String.valueOf(cell.getNumericCellValue())+"";
break;
case Cell.CELL_TYPE_STRING:
cellval = cell.getStringCellValue();
break;
default:
break;
}
if(cellval!="")
{
valueMap.put(titleList.get(j), cellval); valueMap.put("ResultRow",String.valueOf(row.getRowNum()));
valueMap.put("ResultCol",String.valueOf(0));
}
}
j++;
}
if(i!=0 && !valueMap.isEmpty()){
//System.out.println(valueMap);
sheetList.add(valueMap);
}
i++;
}
//System.out.println(sheetList); System.exit(0);
file.close();
XLSbook.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sheetList;
}