Selenium Ramme: Data, søgeord og hybriddrevet

Hvad er Selenium Ramme?

Selenium automatiseringsramme er en kodestruktur, der gør kodevedligeholdelse nem og effektiv. Uden rammer kan brugere placere "koden" og "dataene" på samme sted, som hverken kan genbruges eller læses. Rammer giver gavnlige resultater som øget kodegenanvendelighed, højere portabilitet, reducerede omkostninger til scriptvedligeholdelse, bedre kodelæsbarhed osv.

Typer af Selenium Framework

Der er hovedsageligt tre type rammer lavet af Selenium WebDriver til at automatisere manuelle testsager

  • Datadrevet rammeværk
  • Søgeordsdrevet rammeværk
  • Hybriddrevet rammeværk

Typer af Selenium Framework

Datadrevet rammeværk i Selenium

Datadrevet rammeværk i Selenium er en metode til at adskille datasæt fra testcasen. Når datasættene er adskilt fra testcasen, kan de let modificeres til en specifik funktionalitet uden at ændre koden. Det bruges til at hente testcases og suiter fra eksterne filer som f.eks Excel, .csv, .xml eller nogle databasetabeller.

Datadrevet rammeværk i Selenium

For at læse eller skrive en Excel giver Apache et meget berømt biblioteks-POI. Dette bibliotek er i stand til at læse og skrive begge dele XLS og XLSX filformat af Excel.

At læse XLS filer, en HSSF implementering leveres af POI-biblioteket.

At læse XLSX, XSSF gennemførelse af POI bibliotek vil være valget. Lad os studere disse implementeringer i detaljer.

Vi har allerede lært om datadrevet test i vores tidligere vejledning

Keyword Driven Framework i Selenium

Keyword Driven Framework i Selenium er en metode, der bruges til at fremskynde automatiseret test ved at adskille nøgleord for fælles sæt funktioner og instruktioner. Alle operationer og instruktioner, der skal udføres, er skrevet i en ekstern fil som et Excel-ark. Brugere kan nemt styre og specificere de funktionaliteter, de vil teste.

Sådan ser den komplette ramme ud

Keyword Driven Framework i Selenium

Som du kan se, er det en 5-trins ramme. Lad os studere det trinvist i detaljer

Trin 1)

  • Driver-scriptet Execute.java vil kalde ReadGuru99ExcelFile.java
  • ReadGuru99ExcelFile.java har POI-script til at læse data fra en Excel

Trin 2)

  • ReadGuru99ExcelFile.java vil læse data fra TestCase.xlsx
  • Sådan ser arket ud -

Keyword Driven Framework i Selenium

  • I henhold til nøgleordene skrevet i Excel-fil, vil rammen udføre handlingen på brugergrænsefladen.
  • For eksempel skal vi klikke på en knap 'Login'. Tilsvarende vil vores Excel have et søgeord 'Klik'. Nu kan AUT have hundredvis af knapper på en side, for at identificere en login-knap, i Excel vil vi indtaste Objektnavn som loginButton & objekttype som et navn (se den fremhævede række i ovenstående billede). Objekttypen kunne være Xpath, navn CSS eller en hvilken som helst anden værdi

Trin 3) ReadGuru99ExcelFile.java vil videregive disse data til driverscriptet Execute.java

Trin 4)

  • For alle vores UI-webelementer er vi nødt til at oprette et objektlager, hvor vi placerer deres elementlocator (som Xpath, navn, CSS-sti, klassenavn osv.)

Keyword Driven Framework i Selenium

  • Execute.java (vores driverscript) vil læse hele objektlageret og gemme det i en variabel
  • For at læse dette objektlager har vi brug for en ReadObject-klasse, som har en getObjectRepository-metode til at læse den.
  • Keyword Driven Framework i Selenium

BEMÆRK VENLIGST: Du tænker måske, hvorfor skal vi oprette et objektlager. Svaret hjælper med kodevedligeholdelse. For eksempel bruger vi knappen med navn = btnlogin i 10 forskellige testcases. Fremover beslutter udvikleren at ændre navnet fra btnlogin for at indsende. Du bliver nødt til at foretage en ændring i alle de 10 testcases. I tilfælde af et objektlager vil du kun foretage ændringen én gang i lageret.

Trin 5)

  • Driveren sender dataene fra Excel & Object Repository til brugergrænsefladenOperation klasse
  • UIOperation-klassen har funktioner til at udføre handlinger svarende til nøgleord som CLICK, SETTEXT osv... nævnt i excel
  • UIOperation klasse er en Java klasse, som har den faktiske implementering af koden til at udføre operationer på webelementer

Keyword Driven Framework i Selenium

Det komplette projekt vil se ud -

Keyword Driven Framework i Selenium

Lad os se på et eksempel:

Testscenarie: Vi udfører 2 testcases

objekt.egenskaber

url=http://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset

ReadGuru99ExcelFile.java

package excelExportAndFileIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadGuru99ExcelFile {
    
    public Sheet readExcel(String filePath,String fileName,String sheetName) throws IOException{
    //Create a object of File class to open xlsx file
    File file =    new File(filePath+"\\"+fileName);
    //Create an object of FileInputStream class to read excel file
    FileInputStream inputStream = new FileInputStream(file);
    Workbook guru99Workbook = null;
    //Find the file extension by spliting file name in substing and getting only extension name
    String fileExtensionName = fileName.substring(fileName.indexOf("."));
    //Check condition if the file is xlsx file
    if(fileExtensionName.equals(".xlsx")){
    //If it is xlsx file then create object of XSSFWorkbook class
    guru99Workbook = new XSSFWorkbook(inputStream);
    }
    //Check condition if the file is xls file
    else if(fileExtensionName.equals(".xls")){
        //If it is xls file then create object of XSSFWorkbook class
        guru99Workbook = new HSSFWorkbook(inputStream);
    }
    //Read sheet inside the workbook by its name
    Sheet guru99Sheet = guru99Workbook.getSheet(sheetName);
     return guru99Sheet;    
    }
}

ReadObject.java

package operation;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ReadObject {
    Properties p = new Properties();
    public Properties getObjectRepository() throws IOException{
        //Read object repository file
        InputStream stream = new FileInputStream(new File(System.getProperty("user.dir")+"\\src\\objects\\object.properties"));
        //load all objects
        p.load(stream);
         return p;
    }
    
}

UIOperation.java

package operation;
import java.util.Properties;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class UIOperation {
    WebDriver driver;
    public UIOperation(WebDriver driver){
        this.driver = driver;
    }
    public void perform(Properties p,String operation,String objectName,String objectType,String value) throws Exception{
        System.out.println("");
        switch (operation.toUpperCase()) {
        case "CLICK":
            //Perform click
            driver.findElement(this.getObject(p,objectName,objectType)).click();
            break;
        case "SETTEXT":
            //Set text on control
            driver.findElement(this.getObject(p,objectName,objectType)).sendKeys(value);
            break;
            
        case "GOTOURL":
            //Get url of application
            driver.get(p.getProperty(value));
            break;
        case "GETTEXT":
            //Get text of an element
            driver.findElement(this.getObject(p,objectName,objectType)).getText();
            break;
        default:
            break;
        }
    }
    
    /**
     * Find element BY using object type and value
     * @param p
     * @param objectName
     * @param objectType
     * @return
     * @throws Exception
     */
    private By getObject(Properties p,String objectName,String objectType) throws Exception{
        //Find by xpath
        if(objectType.equalsIgnoreCase("XPATH")){
            
            return By.xpath(p.getProperty(objectName));
        }
        //find by class
        else if(objectType.equalsIgnoreCase("CLASSNAME")){
            
            return By.className(p.getProperty(objectName));
            
        }
        //find by name
        else if(objectType.equalsIgnoreCase("NAME")){
            
            return By.name(p.getProperty(objectName));
            
        }
        //Find by css
        else if(objectType.equalsIgnoreCase("CSS")){
            
            return By.cssSelector(p.getProperty(objectName));
            
        }
        //find by link
        else if(objectType.equalsIgnoreCase("LINK")){
            
            return By.linkText(p.getProperty(objectName));
            
        }
        //find by partial link
        else if(objectType.equalsIgnoreCase("PARTIALLINK")){
            
            return By.partialLinkText(p.getProperty(objectName));
            
        }else
        {
            throw new Exception("Wrong object type");
        }
    }
}

ExecuteTest.java

package testCases;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;
public class ExecuteTest {
@Test
    public void testLogin() throws Exception {
        // TODO Auto-generated method stub
WebDriver webdriver = new FirefoxDriver();
ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
ReadObject object = new ReadObject();
Properties allObjects = object.getObjectRepository();
UIOperation operation = new UIOperation(webdriver);
//Read keyword sheet
Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework");
//Find number of rows in excel file
    int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum();
    //Create a loop over all the rows of excel file to read it
    for (int i = 1; i < rowCount+1; i++) {
        //Loop over all the rows
        Row row = guru99Sheet.getRow(i);
        //Check if the first cell contain a value, if yes, That means it is the new testcase name
        if(row.getCell(0).toString().length()==0){
        //Print testcase detail on console
            System.out.println(row.getCell(1).toString()+"----"+ row.getCell(2).toString()+"----"+
            row.getCell(3).toString()+"----"+ row.getCell(4).toString());
        //Call perform function to perform operation on UI
            operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
                row.getCell(3).toString(), row.getCell(4).toString());
     }
        else{
            //Print the new testcase name when it started
                System.out.println("New Testcase->"+row.getCell(0).toString() +" Started");
            }
        }
    }
}

Efter udførelse vil output se sådan ud -

Keyword Driven Framework i Selenium

Download Selenium Projektfiler til demoen i denne vejledning

Hybriddrevet rammeværk

Hybriddrevet rammeværk in Selenium er et koncept, hvor vi bruger fordelen ved både søgeordsdrevet framework og datadrevet framework. Det er et brugervenligt framework, som giver manuelle testere mulighed for at oprette testcases ved blot at se på nøgleord, testdata og objektlager uden at kode i rammen.

Her til nøgleord vil vi bruge Excel-filer til at vedligeholde testcases, og til testdata kan vi bruge data, udbyder af Testng rammer.

Hybriddrevet rammeværk

Her i vores hybrid-framework behøver vi ikke at ændre noget i Keyword-drevet framework, her skal vi blot erstatte filen ExecuteTest.java med filen HybridExecuteTest.java.

Hybriddrevet rammeværk

Denne HybridExecuteTest-fil har al koden til nøgleordsdrevet med dataleverandørkoncept.

Den komplette billedrepræsentation af hybridramme vil se ud

Hybriddrevet rammeværk

HybridExecuteTest.java

package testCases;
import java.io.IOException;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;
public class HybridExecuteTest {
    WebDriver webdriver = null;
@Test(dataProvider="hybridData")
    public void testLogin(String testcaseName,String keyword,String objectName,String objectType,String value) throws Exception {
        // TODO Auto-generated method stub
      
    if(testcaseName!=null&&testcaseName.length()!=0){
    webdriver=new FirefoxDriver();
    }
ReadObject object = new ReadObject();
Properties allObjects = object.getObjectRepository();
UIOperation operation = new UIOperation(webdriver);
    //Call perform function to perform operation on UI
            operation.perform(allObjects, keyword, objectName,
                objectType, value);
    
    }
@DataProvider(name="hybridData")
    public Object[][] getDataFromDataprovider() throws IOException{
    Object[][] object = null;
    ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
//Read keyword sheet
Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework");
//Find number of rows in excel file
    int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum();
    object = new Object[rowCount][5];
    for (int i = 0; i < rowCount; i++) {
        //Loop over all the rows
        Row row = guru99Sheet.getRow(i+1);
        //Create a loop to print cell values in a row
        for (int j = 0; j < row.getLastCellNum(); j++) {
            //Print excel data in console
            object[i][j] = row.getCell(j).toString();
        }
    }
    System.out.println("");
     return object;    
    }
}

Resumé

  • Vi kan oprette tre typer testramme vha Selenium WebDriver.
  • A Selenium automatiseringsramme, der kan klassificeres i datadrevne, søgeordsdrevne og hybride rammer.
  • Vi kan opnå datadrevne rammer ved hjælp af TestNG's dataudbyder.
  • I nøgleordsdrevet framework er nøgleord skrevet i nogle eksterne filer som excel-fil og java-kode vil kalde denne fil og udføre testcases.
  • Den hybride ramme er en blanding af nøgleordsdrevet og datadrevet rammeværk.

Download Selenium Projektfiler til demoen i denne vejledning