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 读取数据如果我不能使用方法的行号和列号,因为我有太多需要处理的字段。其背后的原因是,将来如果一个字段添加到单一表单中,它将被返工,这又是不可行的。

enter image description here

我一直在关注这个link: http://www.softwaretestinghelp.com/selenium-framework-design-selenium-tutorial-21/

用于按列读取数据,但无论如何我都无法根据列 header 获取记录。我们还有其他方法可以实现吗?

谢谢

  1. "testNG data providers but it looks like that it returns only strings" - 不正确。它允许您 return 类型 Object 的多维数组。你创造什么样的object就是你自己的代码。您可以选择从 excel 中读取,将所有字段封装在一个 object(您自己的 pojo)或多个 object 中,然后方法参数可以只包含那些 object 声明的类型而不是 50 个字符串。

  2. 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;

    }