0

Read and Write data from Excel using 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 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 match 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\\nguyen.thi.thu.huong\\Downloads\\chromedriver_win32\\chromedriver.exe";
	public static final String DRIVER = "webdriver.chrome.driver";
	public static final String URL = "https://selenium-training.herokuapp.com/";

	String fileInputPath = "F:\\workspace\\Test Final\\input.xls";
	String fileTemplatePath = "F:\\workspace\\Test Final\\data_template.xls";
	String fileOutputPath = "F:\\workspace\\Test Final\\ouput.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']")).click();

		driver.manage().timeouts().implicitlyWait(20000, TimeUnit.MILLISECONDS);
		System.out.println("checkdataInput====>" + checkDataInput(name));
		testResult = new HashMap();
		testResult.put("testcase", "SignUp");
		testResult.put("name", name);
		testResult.put("email", email);
		testResult.put("pass", pass);
		testResult.put("passConfirm", passConfirm);

		if (!checkDataInput(name)) {
			if (getMessageError() != null) {
				testResult.put("testresult", false);
				testResult.put("error", getMessageError());
				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);

	}

	@Test(priority = 3)
	public void export() throws IOException {
		writeExcell(fileTemplatePath, fileOutputPath, testResultExport);
	}

	public boolean checkDataInput(String name) {
		try {
			WebElement profile = driver.findElement(By.cssSelector(".user_info h1 img"));
			String strName = profile.getAttribute("alt");
			if (!name.isEmpty() && name.equals(strName)) {
				return true;
			}
		} catch (Exception e) {
			return false;
		}
		return false;
	}

	public String getMessageError() {
		WebElement error_message = driver.findElement(By.id("error_explanation"));
		List<WebElement> alertList = (List<WebElement>) error_message.findElements(By.tagName("ul"));
		for (WebElement element : alertList) {
			if (element != null)
				return element.getText();
		}
		return null;
	}

	public void logout() {
		Actions actions = new Actions(driver);
		actions.moveToElement(driver.findElement(By.cssSelector("header ul li[class='dropdown']"))).perform();
		WebElement li = driver.findElement(By.cssSelector("header ul li[class='dropdown']"));
		actions.moveToElement(li.findElement(By.linkText("Log out"))).click().perform();
	}

	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);
				JxlsHelper.getInstance().processTemplate(is, os, context);

			} catch (Exception e) {

			}
		} catch (Exception e) {

		}
	}

	@BeforeTest
	public void openBrowser() {
		System.setProperty(DRIVER, PATH);
		driver = new ChromeDriver();
		driver.manage().window().maximize();
		driver.get(URL);
	}

	@AfterTest
	public void closebrowser() {
	}

}

Kết quả nhận được khi chạy chương trình với bộ dữ liệu input ở trên sẽ thu được file output.xls như sau:

Các thư viện sử dụng trong chương trình:

  • Selenium-server-standalone-2.53.1
  • Commons collections 4.4.1
  • Commons jexl 2.1.1
  • jxls 2.4.1
  • jxls poi 1.0.13
  • log4j 1.2.17
  • poi 3.16
  • poi ooxml 3.16
  • slf4j api 1.7.25
  • slf4j jcl 1.7.25

Tài liệu tham khảo

  1. http://jxls.sourceforge.net/getting_started.html
  2. http://www.software-testing-tutorials-automation.com/2014/01/learn-selenium-webdriver-online-free.html

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí