Reading an Excel File and Submitting a Web Form Using Selenium Java
Pre-requisites:
- geckodriver.exe
- maven dependencies for apache poi & Selenium
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
This automation process is divided into two parts:
- Reading from an Excel file
- WebForm Automated Filling & Submission
Reading an MS Excel File Using Apache POI:
Apache POI is an
open-source java library developed and
distributed by Apache Software Foundation to design and modify MS Office
files. We will be using XSSF a class apache poi. XSSF:
XML Spreadsheet Format is used for .xlsx files of MS-Excel.
-
Reading an Excel file using
Java Apache POIis a six-step process: - Put Excel file on input Stream.
- Create a workbook instance of an excel sheet.
- Get to the desired sheet of file.
- Iterate rows of files.
-
Iterate over all cells in one row and place the values into an
object of a custom class
Record. - Repeat steps 4 and 5 until all data is read
Let’s see all the above steps in the code. The following function
readFile() read all the values in the Excel file – cell
by cell and returns a list of Records.
public static ArrayList<Record> readFile(String filePath) throws IOException {
ArrayList<Record> recordArrayList = new ArrayList<>();
try {
//put file on input stream
FileInputStream file = new FileInputStream(new File(filePath));
XSSFWorkbook workbook = new XSSFWorkbook(file);
//Get desired sheet from the workbook
XSSFSheet sheet = workbook.getSheetAt(0);
//Iterate through each row one by one
Iterator<Row> rowIterator = sheet.iterator();
Row row = rowIterator.next();
//get value from each cell and insert it into Record object
while (rowIterator.hasNext()) {
row = rowIterator.next();
Record record = new Record();
//insert data from cells to record Object
Cell cell = row.getCell(0);
record.id = (int) cell.getNumericCellValue();
cell = row.getCell(1);
record.name = cell.getStringCellValue();
cell = row.getCell(2);
record.age = (int) cell.getNumericCellValue();
cell = row.getCell(3);
record.gender = cell.getStringCellValue();
cell = row.getCell(4);
record.city = cell.getStringCellValue();
cell = row.getCell(5);
record.courses = (cell.getStringCellValue()).split(",");
cell = row.getCell(6);
record.goal = cell.getStringCellValue();
recordArrayList.add(record);
}
file.close();
} catch (Exception e) {
e.printStackTrace();
}
return recordArrayList;
}
Following is the code for Record.java class:
public class Record {
int id;
int age;
String name;
String city;
String gender;
String[] courses;
String goal;
}
WebForm Automation Using Selenium:
Selenium is an
open-source web-based automation tool
that is implemented using a web driver. We will be using geckodriver because Selenium 3 enables
geckodriver as the default WebDriver implementation for Firefox.The process involves 3 base steps.
-
Set
webdriver.gecko.driverand its'pathas a system property. - Set the firefox diver and wait for attribute.
-
Fire up the driver by using the
hyperlinkof web form.
//set firefox webdriver
System.setProperty("webdriver.gecko.driver",GECKODRIVER_PATH);
WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(120));
//get the firefox browser & Browse the Google form
String wedFormHyperlink = "https://docs.google.com/forms/d/e/1FAIpQLSd3hbwlnuLuwVVnP3iEAjQwXQuZ7PuiTNMuuYe0TcHHYqZ6uQ/viewform";
driver.get(wedFormHyperlink);
- Apply and wait for the DOM to be ready.
-
Identify
HTML&CSSselectors of fields in web form. - Click the field section to make it visible for getting the corresponding web element.
- Get the web element or a list of web elements by using css-selectors of the corresponding field of the form.
- Send the value of the field as key (in case of input fields)
- In case of drop-down, checkboxes, radio buttons and etc, click
the
flexelement. (Got as web element using css selector) - Repeat steps 2-5 to fill and submit the form.
fillTheForm() fills the form using values in the
Record object, submits the form, and then redirects to fill
against other records.
public static void fillTheForm(Record rc, WebDriverWait wait, WebDriver driver) {
//wait until document is ready
wait.until(ExpectedConditions.titleContains("Self-Development Boot Camp"));
//insert data fom ArrayList to the web form
List<WebElement> genderElements = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("div.nWQGrd.zwllIb")));
//set Gender
if (rc.gender.equals("Male"))
genderElements.get(0).click();
else
genderElements.get(1).click();
//set input fields (id,name,age.goals)
List<WebElement> inputElements = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("input.whsOnd.zHQkBf")));
inputElements.get(0).click();
inputElements.get(0).sendKeys(Integer.toString(rc.id));
inputElements.get(1).click();
inputElements.get(1).sendKeys(rc.name);
inputElements.get(2).click();
inputElements.get(2).sendKeys(Integer.toString(rc.age));
WebElement textarea = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("textarea.KHxj8b.tL9Q4c")));
textarea.click();
textarea.sendKeys(rc.goal);
//open cities drop-drown menu
driver.findElements(By.cssSelector("span.vRMGwf.oJeWuf")).get(0).click();
//get dropdown items
List<WebElement> allCities = driver.findElements(By.cssSelector("span.vRMGwf.oJeWuf"));
//getting the valid index after removing empty divs
int allCitiesIndex = allCities.size() - 6;
//Removing extra divs
for (int i = 0; i < allCitiesIndex; i++)
allCities.remove(0);
//set city-items
Boolean citiesFlag = false;
for (WebElement wb : allCities) {
if (rc.city.equals(wb.getText())) {
wb.click();
citiesFlag = true;
break;
}
}
if (citiesFlag == false)
allCities.get(5).click();
//click the courses section to make it available for selenium processing
driver.findElements(By.cssSelector("div.z12JJ")).get(4).click();
//Set Courses
List<WebElement> allCourses = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("div.ulDsOb")));
//remove extra divs
allCourses.remove(0);
allCourses.remove(0);
//set course-checkbox
for (WebElement course : allCourses) {
for (String eachCourse : rc.courses) {
if (eachCourse.equals(course.getText()))
course.click();
}
}
WebElement submitDiv = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div.lRwqcd")));
//submit button click
submitDiv.findElement(By.cssSelector("span.l4V7wb.Fxmcue")).click();
//move to the next response - redirect the webdriver to the same form
WebElement nextResponseForm = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div.c2gzEf")));
nextResponseForm.findElement(By.tagName("a")).click();
}
Output:
All resources used in this tutorial are attached:
- source code
- geckdriver.exe
- Excel File
- Jar files to be included in the classpath

Comments
Post a Comment