How to Generate PDF Report in Selenium WebDriver

In some cases, test engineers need to export or save Selenium WebDriver test result in Pdf file format.  In this example below, I will explain how to write test results as a pdf file. 

Login Test Case:

1. Go to
2. Enter "test" in the Username field
3. Enter "XXXX" in the Password filed
4. Click on the Login button
5. Verify that the text "Selenium Test" is present.

Step 1: on Eclipse, create a Java Project called SeleniumMasterLoginTestPdfExport. Add a package named com.seleniummaster.testresultpdfproject and then add two classes:

  • LoginTest class (this is a TestNG class)
  • PdfUtility class

and also, in the build path, add Selenium libraries and Apache Pdfbox library as reference jar files. 

Step 2: open file and write the code below



package com.seleniummaster.testresultpdfproject;
import java.util.List;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

public class PdfUtility {
//define a Pdf Document variable named doc
 private PDDocument doc;
 //function to write test results to pdf file with file name and list of test cases
 public void WriteTestResultToPdfFile(String fileName,List<String> testCasethrows IOException, COSVisitorException
      //create a new  pdf document
    doc = new PDDocument();
    //create a new pdf page
      PDPage page = new PDPage();
      //set font for the pdf
      PDFont font=PDType1Font.HELVETICA;
      //set fontsize=12
    int  fontSize=12;
    //add page to the pdf document
      //create a new content stream that will be written to the pdf file
      PDPageContentStream contentStream = new PDPageContentStream(doc, page);
      //define cursor position
         float x=10;
      float y=750;
      //if there is no test case string, return nothing    
          if (testCase.size() == 0) { return}
          //get number of test case lines
          final int numberOfLines = testCase.size();
          //get fontHeight
          final float fontHeight = font.getFontDescriptor().getFontBoundingBox().getHeight()/1000 * fontSize;
          //set font to use in the content stream
          contentStream.setFont(font, fontSize);
          //set content stream begin
          //move content stream cursor position to (x,y)
          contentStream.moveTextPositionByAmountx, y);
          //add a new row with the fontHeight
          contentStream.appendRawCommands(fontHeight + " TL\n");
          //loop through all the lines in the test case list
          for (int i = 0; i < numberOfLines; i++) {
            //when current line is not end of the line, change the line, so content will be written to the next line
            if (i < numberOfLines - 1) {
          //end content stream
          //close content stream
         //write the pdf file;
      //finally close the pdf document
    if (doc != null)

Step 3: open the file and write the code below

package com.seleniummaster.testresultpdfproject;
import static org.testng.AssertJUnit.assertEquals;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class LoginTest {
//define a WebDriver named driver
 private WebDriver driver;
 //create a resultList that will contain number of test cases
 List<String> resultList=new ArrayList<String>();
 //create an instance of PdfUtilityClass
 PdfUtility pdfUtility=new PdfUtility();
 //login test
  public void SeleniumMasterLoginTest() {
      //open login page
        //maximize the window
      //type in user name 
      //type in user password
      driver.findElement("login_login_password")).sendKeys("XXXXXX")//here password is omitted
      //click on the submit button
     //within 60 seconds try asserting that user logged on
       for (int second = 0;; second++) {
        if (second >="timeout");
          assertEquals("Online users", driver.findElement(By.cssSelector("#sb-onlineusers > h3")).getText());
          //add test case to the resultList as pass
          resultList.add("2, Login to the site,User should be able to login, User logged in, Pass");
        catch (Exception e) {
          //add test case to the resultList as fail
          resultList.add("2, Login to the site,User should be able to login, User did not logged in, Fail");
  public void Setup() {
//add test result header information to the resultList
resultList.add("Step Id, Action,Expected Result, Actual Result, Test Result");
  //initialize Firefox driver
  driver=new FirefoxDriver();
  //obtain windows handler name
  String windowsHandle=driver.getWindowHandle();
  //assert that a window has been launched
  assertEquals(true, windowsHandle.length()>0);
  //add a test step string to the resultList as pass after assertion true
  resultList.add("1, Open Browser,Browser should open, Browser Opened, Pass");
catch(Exception e)
  //add a test step string to the resultList as fail after assertion true
  resultList.add("1, Open Browser,Browser should open, Browser NOT Opened, Fail");  

  public void TearDown() throws COSVisitorException, IOException {
  //close the driver
 //define a time stamp string to add to the test result 
 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
 //add time stamp to the resultList
 resultList.add("Test Ends: " + timeStamp);
 //write the test result pdf file with file name TestResult
  pdfUtility.WriteTestResultToPdfFile("TestResult.pdf", resultList)
  //quit the driver


Step 4: right click on the testng.xml file and run as TestNG Suite. 

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<test name="LoginTest">
<class name="com.seleniummaster.testresultpdfproject.LoginTest"/>
</test> <!-- Test -->
</suite> <!-- Suite -->



Step 5: in the project folder, you will see a test result pdf file named "TestResult.pdf".  The file contains following contents. 


If you need more information about creating pdf files, please visit Apache Pdfbox tutorial page