Reading excel file, excute test and export results to excel with Selenium
Bài viết này trình bày một chương trình cơ bản thực hiện tự động Sign Up tại một website, với dữ liệu Sign Up được đọc ra từ file excel, dữ liệu đầu vào sẽ được kiểm tra, và kết quả Sign Up sẽ được ghi vào một file excel output, mỗi dòng excel được ghi ra là kết quả của 1 case trong bộ testcase ...
Bài viết này trình bày một chương trình cơ bản thực hiện tự động Sign Up tại một website, với dữ liệu Sign Up được đọc ra từ file excel, dữ liệu đầu vào sẽ được kiểm tra, và kết quả Sign Up sẽ được ghi vào một file excel output, mỗi dòng excel được ghi ra là kết quả của 1 case trong bộ testcase input đầu vào. Sử dụng Selenium sẽ tự động fill dữ liệu vào các trường cần thiết của form SignUp mà không cần input data bằng tay, giảm nhiều effort cho QA, Tester.
1. Creating Excel Template
- Template Excel nhằm mục đích quy định dữ liệu output theo một format nhất định.
- Jxls cung cấp một số bộ xử lý được tích hợp sẵn có thể được sử dụng để phân tích một mẫu excel và trích xuất các lệnh điều khiển. Ví dụ có một đối tượng User với các thuộc tính như dưới đây: Lớp User
public class User { private String name; private String email; private String pass; private String passConfirm; public User() { } public User(String name, String email, String pass, String passConfirm) { this.name = name; this.email = email; this.pass = pass; this.passConfirm = passConfirm; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getPassConfirm() { return passConfirm; } public void setPassConfirm(String passConfirm) { this.passConfirm = passConfirm; } }
Xây dựng 1 file template kiểm tra thông tin User khi SignUp, kết quả SignUp được lưu vào file output.xls theo định dạng của file template sau:
- Add một comment vào cell A1 jx:area(lastCell="G3"), comment này khai báo vùng root của template là từ A1 tới G3.
- Một comment ở cell A3 định nghĩa mỗi lệnh Jxls theo cú pháp sau: jx:each(items="results" var="result" lastCell="G3") . Lệnh này thực hiện lặp và lấy thông tin của các đối tượng dưới khoá "results" trong Jxls, từng thuộc tính cụ thể được lấy bởi khoá "result", được định nghĩa bởi attribute var, các tham biến trong template sẽ được map tương ứng như sau:
testResult = new HashMap(); testResult.put("testcase", "SignUp"); testResult.put("name", name); => key "name" trùng với "name" trong template ${result.name} testResult.put("email", email); => key "email" trùng với "email" trong ${result.email} testResult.put("pass", pass); => key "pass" trùng với "pass" trong ${result.pass} testResult.put("passConfirm", passConfirm); => key "passConfirm" trùng với "pass" trong ${result.passConfirm} if (!checkDataInput(name)) { if (getMessageError() != null) { testResult.put("testresult", false); =>key "testresult" trùng với "testresult" trong ${result.testresult} testResult.put("error", getMessageError()); => key "error" trùng với "error" trong ${result.error} Assert.assertEquals(checkDataInput(name), false); driver.get(URL); } } else { testResult.put("testresult", checkDataInput(name)); testResult.put("error", ""); Assert.assertEquals(checkDataInput(name), true); logout(); } testResultExport.add(testResult); ... public void writeExcell(String fileInputStream, String fileOutputStream, List inputList) { try (InputStream is = new FileInputStream(fileInputStream)) { try (OutputStream os = new FileOutputStream(fileOutputStream)) { Context context = new Context(); context.putVar("results", inputList); => Key "results" trùng với khoá items = "results" trong comment cell A3 JxlsHelper.getInstance().processTemplate(is, os, context); } catch (Exception e) { } } catch (Exception e) { } }
Vậy là đã tạo xong file template cho dữ liệu output.
2. Đọc dữ liệu test
Đọc dữ liệu input từ file input, giả sử ta có file data input như dưới đây Chương trình đọc file Read file excel
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadExcel { private Object getCellValue(Cell cell) { switch (cell.getCellTypeEnum()) { case STRING: return cell.getStringCellValue(); case BOOLEAN: return cell.getBooleanCellValue(); case NUMERIC: return cell.getNumericCellValue(); default: break; } return null; } public List<User> readDataExcel(String excelFilePath) throws IOException { List<User> listUsers = new ArrayList<>(); FileInputStream inputStream = new FileInputStream(new File(excelFilePath)); Workbook workbook = getWorkbook(inputStream, excelFilePath); Sheet firstSheet = workbook.getSheetAt(0); Iterator<Row> iterator = firstSheet.iterator(); while (iterator.hasNext()) { Row nextRow = iterator.next(); Iterator<Cell> cellIterator = nextRow.cellIterator(); User user = new User(); while (cellIterator.hasNext()) { Cell nextCell = cellIterator.next(); int columnIndex = nextCell.getColumnIndex(); switch (columnIndex) { case 0: user.setName((String) getCellValue(nextCell)); break; case 1: user.setEmail((String) getCellValue(nextCell)); break; case 2: user.setPass((String) getCellValue(nextCell)); break; case 3: user.setPassConfirm((String) getCellValue(nextCell)); } } listUsers.add(user); } listUsers.remove(0); workbook.close(); inputStream.close(); return listUsers; } private Workbook getWorkbook(FileInputStream inputStream, String excelFilePath) throws IOException { Workbook workbook = null; if (excelFilePath.endsWith("xlsx")) { workbook = new XSSFWorkbook(inputStream); } else if (excelFilePath.endsWith("xls")) { workbook = new HSSFWorkbook(inputStream); } else { throw new IllegalArgumentException("The specified file is not Excel file"); } return workbook; } }
3. Ghi kết quả ra file excel
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class WriteExcel { public void createHeaderRow(Sheet sheet) { CellStyle cellStyle = sheet.getWorkbook().createCellStyle(); Font font = sheet.getWorkbook().createFont(); font.setBold(true); font.setFontHeightInPoints((short) 16); cellStyle.setFont(font); Row row = sheet.createRow(0); Cell cellTestcase = row.createCell(1); cellTestcase.setCellStyle(cellStyle); cellTestcase.setCellValue("TestCase"); Cell cellName = row.createCell(2); cellName.setCellStyle(cellStyle); cellName.setCellValue("Name"); Cell cellEmail = row.createCell(3); cellEmail.setCellStyle(cellStyle); cellEmail.setCellValue("Email"); Cell cellPass = row.createCell(4); cellPass.setCellStyle(cellStyle); cellPass.setCellValue("Pass"); Cell cellPassConfirm = row.createCell(5); cellPassConfirm.setCellStyle(cellStyle); cellPassConfirm.setCellValue("PassConfirm"); Cell cellTestResult = row.createCell(6); cellPassConfirm.setCellStyle(cellStyle); cellPassConfirm.setCellValue("TestResult"); } private Workbook getWorkbook(String excelFilePath) throws IOException { Workbook workbook = null; if (excelFilePath.endsWith("xlsx")) { workbook = new XSSFWorkbook(); } else if (excelFilePath.endsWith("xls")) { workbook = new HSSFWorkbook(); } else { throw new IllegalArgumentException("The specified file is not Excel file"); } return workbook; } }
4. Chương trình chính
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import org.jxls.common.Context; import org.jxls.util.JxlsHelper; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class SignUp { public static final String PATH = "C:Users guyen.thi.thu.huongDownloadschromedriver_win32chromedriver.exe"; public static final String DRIVER = "webdriver.chrome.driver"; public static final String URL = "https://selenium-training.herokuapp.com/"; String fileInputPath = "F:workspaceTest Finalinput.xls"; String fileTemplatePath = "F:workspaceTest Finaldata_template.xls"; String fileOutputPath = "F:workspaceTest Finalouput.xls"; WebDriver driver = null; ReadExcel readExcel = new ReadExcel(); List<User> listUsers; List testResultExport = new ArrayList(); Map testResult = new HashMap(); @Test(priority = 0) public void importTestData() throws IOException { listUsers = readExcel.readDataExcel(fileInputPath); } @DataProvider(name = "dataInput") public Object[][] dataSignUp() { int numberCases = listUsers.size(); Object[][] Cred = new Object[numberCases][4]; for (int i = 0; i < numberCases; i++) { User x = (User) listUsers.get(i); Cred[i][0] = x.getName(); Cred[i][1] = x.getEmail(); Cred[i][2] = x.getPass(); Cred[i][3] = x.getPassConfirm(); } System.out.println("object data" + Cred); return Cred; } @Test(dataProvider = "dataInput", priority = 1) public void signUp(String name, String email, String pass, String passConfirm) { driver.findElement(By.cssSelector("a[href='/signup']")).click(); driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); WebElement signUpForm = driver.findElement(By.id("new_user")); signUpForm.findElement(By.id("user_name")).sendKeys(name); signUpForm.findElement(By.id("user_email")).sendKeys(email); signUpForm.findElement(By.id("user_password")).sendKeys(pass); signUpForm.findElement(By.id("user_password_confirmation")).sendKeys(passConfirm); signUpForm.findElement(By.cssSelector("input[type='submit']"