Java Selenium Cucumber Excel数据驱动

Java Sellinum Cucumber Excell data driven

需要根据 Excel 文件中的给定“键”获取“值” 我有 excel 个文件 文件名测试 xlsx 和 sheet 姓名 sheet1

And sheet 包含以下键值对 and。 JIRA 票证是唯一的。

Test case description testdata key Testdatavalue testdata2 key Testdata2 Value testdata3 key Testdata3 value
Sampiletest description1 Testcase-jira-1 user1id Harshadh Password 123ggg
Sampiletest2 discription Testcase-jira-2 user2 Ramu Password123 333ggg
Sampiletest3 discription Test case jira-3 user3 latha Password556 73hhh

最多 N 行

这里,我需要使用Java Selenium Cucumber 以如下方式获取数据。我将使用上面的测试数据通过 BDD 方式传入 Cucumber step definition class 文件。

如何获取definition文件中的数据 1)如果从当前行传递键值,我们如何获取值的值,为 webSeleinum 元素提供测试输入 示例第 4 行数据

Sampiletest3 discription|Test case jira-3| user3|latha|Password556|73hhh
.....

如果我调用“user3”应该return“Password556” 我需要获取值的任何行都以同样的方式。 请指导我

我建议将场景的所有数据放入 Gherkin 文档中,但您可能有从 excel 中提取数据的有效用例。但是,根据我的经验,这类要求很少见。不推荐的原因是,您的 BDD 功能文件是您的要求,应该包含正确级别的信息来记录系统的预期行为。如果您的数据来自 excel,那么它只会让需求阅读变得更加困难,并且难以维护。

也就是说,如果您有充分的理由将这些数据存储在 excel 中,您可以使用 NoCodeBDD 轻松实现。您所要做的就是映射列名称并上传 excel,其余的由该工具处理。请检查此 .gif 以了解它是如何完成的。 https://nocodebdd.live/examples-using-excel

免责声明:我是NoCodeBDD的创始人。

如果您使用的是 Junit5,这里有一个如何完成的示例 https://newbedev.com/data-driven-testing-in-cucumber-using-excel-files-code-example

您可以使用外部数据源来提供使用 qaf-cucumber 的示例。它将能够提供数据文件,用于提供来自外部数据源的示例,包括 csvjsonxmlexcel 文件或数据库查询。

您可以试试下面的代码。

特征文件:

  • 在示例中,您可以提供行号和 sheet 名称以使用数据进行迭代。
    Scenario Outline: Login to the application with multiple users.
    
        Given get data from datasheet with "<test_id>" and "<sheetName>"
        And login to the application
    
        Examples: 
          | test_id | sheetName   |
          |       1 | Login       |
          |       2 | Login       |

Excel数据:

从excel读取数据并将其存储在hashmap:

  • 创建一个class来读取数据(例子:ExcelReader)
  • 使用 org.apache.poi.ss.usermodelorg.apache.poi.xssf.usermodel 导入
    
    public class ExcelReader {
    
        private File file;
        private FileInputStream inputStream;
        private String testID;
        private String sheetName;
        private int testIdColumn;
        private int numberOfColumns;
        private XSSFCell cell;
        public  HashMap<String, String> fieldsAndValues;
    
        public ExcelReader(String testId, String sheetName) {
            file = new File(System.getProperty("user.dir") + "Excel location path");
            try {
                inputStream = new FileInputStream(file);
            } catch (FileNotFoundException e) {
                System.out.println("File not found at given location: " + e);
            }
            this.testID = testId;
            this.sheetName = sheetName;
    
            this.readExcelAndCreateHashMapForData();
        }
    
        public HashMap<String, String> readExcelAndCreateHashMapForData() {
            try {
                fieldsAndValues = new HashMap<String, String>();
    
                XSSFWorkbook workBook = new XSSFWorkbook(inputStream);
                XSSFSheet sheet = workBook.getSheet(sheetName);
    
                /* Get number of rows */
                int lastRow = sheet.getLastRowNum();
                int firstRow = sheet.getFirstRowNum();
                int numberOfRows = lastRow - firstRow;
    
                /*
                 * Get test_Id column number.
                 */
                outerloop: for (int row = 0; row < numberOfRows; row++) {
                    numberOfColumns = sheet.getRow(row).getLastCellNum();
                    for (int cellNumber = 0; cellNumber < numberOfColumns; cellNumber++) {
                        cell = sheet.getRow(row).getCell(cellNumber);
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        if (sheet.getRow(row).getCell(cellNumber).getStringCellValue().equalsIgnoreCase("test_ID")) {
                            testIdColumn = sheet.getRow(row).getCell(cellNumber).getColumnIndex();
                            break outerloop;
                        }
                    }
                }
    
                /*
                 * Search for the test id value.
                 */
                outerloop: for (int i = 0; i <= numberOfRows; i++) {
                    
                    cell = sheet.getRow(i).getCell(testIdColumn);
                    cell.setCellType(Cell.CELL_TYPE_STRING);
    
                    if (testID.equals(sheet.getRow(i).getCell(testIdColumn).getStringCellValue())) {
    
                        
                        for (int j = 0; j < numberOfColumns; j++) {
                            XSSFCell key = sheet.getRow(testIdColumn).getCell(j);
                            XSSFCell value = sheet.getRow(i).getCell(j);
    
                            key.setCellType(Cell.CELL_TYPE_STRING);
    
                            if (value == null) {
                                // Not capturing blank cells.
                            } else if (value.getCellType() == XSSFCell.CELL_TYPE_BLANK) {
                                // Not capturing blank cells.
                            } else {
                                value.setCellType(Cell.CELL_TYPE_STRING);
                                String fieldName = sheet.getRow(testIdColumn).getCell(j).getStringCellValue().trim();
                                String fieldValue = sheet.getRow(i).getCell(j).getStringCellValue().trim();
                                fieldsAndValues.put(fieldName, fieldValue);
                            }
                        }
                        System.out.println("Fields and values: " + Arrays.toString(fieldsAndValues.entrySet().toArray()));
                        break outerloop;
                    }
                }
            } catch (Exception e) {
                System.out.println("Exception occurred at getting the sheet: " + e);
            }
            /* Return the hash map */
            return fieldsAndValues;
        }
    
    }

步骤定义:


         ExcelReader excelReader;
    
        @Given("get data from datasheet with \"(.*)\" and \"(.*)\"$")
            public void get_data_from_datasheet(String testId, String sheetName) {            
            excelReader = new ExcelReader(testId, sheetName);
            }
    

     @And("login to the application")
        public void loginApplication(){      
driver.findElement(By.xpath("element")).sendKeys(excelReader.fieldsAndValues.get("UserName"));         
driver.findElement(By.xpath("element")).sendKeys(excelReader.fieldsAndValues.get("PassWord"));      
          driver.findElement(By.xpath("element")).click();  
        }

We cannot directly integrete Excel file data to Gerkin file

相反 在步骤文件中编写单独的方法以从 excel 获取数据并执行您的案例。

我使用下面的代码获取数据——普通代码

public static JSONArray Read_Excel_Data(String filename, String sheetname) throws IOException {
    FileInputStream fileIn = null;
    Workbook workbookout = null;
    JSONArray totalData = new JSONArray();
    try{
        log.info("Filename and Sheet name  : "+filename+", "+ sheetname );
        fileIn = new FileInputStream(new File(filename));
        workbookout = new XSSFWorkbook(fileIn);
        Sheet sh = workbookout.getSheet(sheetname);
        int totRows = sh.getLastRowNum();
        Row hearderRow = sh.getRow(0);
        int totCols = hearderRow.getLastCellNum();


        log.info("Total [ Rows and Colums ]  : [ "+totRows+" and "+ totCols +" ] ");
        for(int i=1; i <= totRows; i++ ){
            log.info("Progressing row : "+i);
            Row tempRw = sh.getRow(i);
            JSONObject jo = new JSONObject();

            for(int j=0; j<totCols; j++ ){
                Cell tempCell = tempRw.getCell(j);
                Cell HeaderCell = hearderRow.getCell(j);
                try{
                    jo.put(HeaderCell.getStringCellValue(), tempCell.getStringCellValue());
                    log.info("Value in "+i+" / "+j+"             :::::::::::: >   "+tempCell.getStringCellValue() );
                }catch (NullPointerException npe){
                    log.warn(":::::::::::: > Null Value in [ "+i+" / "+j+" ] ");
                }
            }
            totalData.add(jo);
        }
        workbookout.close();
        fileIn.close();
        System.out.println("Total data ::::::::  "+totalData.toJSONString());
    }catch(Exception e){
        e.printStackTrace();
        log.error("Error Occured !!"+e.toString());
        workbookout.close();
        fileIn.close();
    }
    return totalData;
}