Selenium Ramverk: Data, nyckelord och hybriddrivet

Vad är Selenium Ramverk?

Ocuco-landskapet Selenium ramverk för automatisering är en kodstruktur som gör kodunderhåll enkelt och effektivt. Utan ramverk kan användare placera "koden" och "data" på samma plats som varken är återanvändbar eller läsbar. Ramar ger fördelaktiga resultat som ökad kodåteranvändbarhet, högre portabilitet, minskad kostnad för skriptunderhåll, bättre kodläsbarhet, etc.

Typer av Selenium Ramverk

Det är huvudsakligen tre typ av ramar skapad av Selenium WebDriver för att automatisera manuella testfall

  • Datadrivet ramverk
  • Sökordsdrivet ramverk
  • Hybriddrivet ramverk

Typer av Selenium Ramverk

Datadrivet ramverk i Selenium

Datadrivet ramverk i Selenium är en metod för att separera datamängder från testfallet. När datamängderna väl är separerade från testfallet kan de enkelt modifieras för en specifik funktionalitet utan att ändra koden. Det används för att hämta testfall och sviter från externa filer som excel, .csv, .xml eller några databastabeller.

Datadrivet ramverk i Selenium

För att läsa eller skriva en Excel, erbjuder Apache en mycket berömd bibliotek POI. Detta bibliotek är kapabelt nog att läsa och skriva båda XLS och XLSX filformatet i Excel.

Att läsa XLS filer, en HSSF implementering tillhandahålls av POI-biblioteket.

Att läsa XLSX, XSSF införande av POI bibliotek blir valet. Låt oss studera dessa implementeringar i detalj.

Vi har redan lärt oss om datadriven testning i vår tidigare handledning

Keyword Driven Framework i Selenium

Keyword Driven Framework i Selenium är en metod som används för att påskynda automatiserade tester genom att separera nyckelord för vanliga funktioner och instruktioner. Alla operationer och instruktioner som ska utföras är skrivna i någon extern fil som ett Excel-ark. Användare kan enkelt styra och specificera de funktioner de vill testa.

Så här ser hela ramverket ut

Keyword Driven Framework i Selenium

Som du kan se är det ett ramverk i 5 steg. Låt oss studera det stegvis i detalj

Steg 1)

  • Drivrutinsskriptet Execute.java kommer att anropa ReadGuru99ExcelFile.java
  • ReadGuru99ExcelFile.java har POI-skript för att läsa data från en Excel

Steg 2)

  • ReadGuru99ExcelFile.java kommer att läsa data från TestCase.xlsx
  • Så här ser arket ut-

Keyword Driven Framework i Selenium

  • Enligt nyckelorden skrivna i Excel-filen kommer ramverket att utföra operationen på UI.
  • Till exempel måste vi klicka på knappen "Logga in". På motsvarande sätt kommer vår Excel att ha nyckelordet "Klick". Nu kan AUT ha hundratals knappar på en sida, för att identifiera en inloggningsknapp, i Excel kommer vi att mata in Objektnamn som inloggningsknapp & objekttyp som ett namn (se den markerade raden i bilden ovan). Objekttypen kan vara Xpath, namn CSS eller något annat värde

Steg 3) ReadGuru99ExcelFile.java skickar dessa data till drivrutinsskriptet Execute.java

Steg 4)

  • För alla våra UI-webbelement måste vi skapa ett objektlager där vi placerar deras elementlokaliserare (som Xpath, namn, CSS-sökväg, klassnamn etc.)

Keyword Driven Framework i Selenium

  • Execute.java (vårt drivrutinsskript) kommer att läsa hela Object Repository och lagra det i en variabel
  • För att läsa det här objektförrådet behöver vi en ReadObject-klass som har en getObjectRepository-metod för att läsa den.
  • Keyword Driven Framework i Selenium

OBS: Du kanske tänker varför vi behöver skapa ett objektförråd. Svaret hjälper till med kodunderhåll. Till exempel använder vi knappen med namn = btnlogin i 10 olika testfall. I framtiden beslutar utvecklaren att ändra namnet från btnlogin för att skicka in. Du måste göra en förändring i alla de 10 testfallen. I fallet med ett objektförråd kommer du att göra ändringen bara en gång i förvaret.

Steg 5)

  • Drivrutinen skickar data från Excel & Object Repository till UIOperationsklass
  • UIOperationklassen har funktioner för att utföra åtgärder som motsvarar nyckelord som CLICK, SETTEXT etc... som nämns i excel
  • UIOperationsklassen är en Java klass som har den faktiska implementeringen av koden för att utföra operationer på webbelement

Keyword Driven Framework i Selenium

Hela projektet kommer att se ut som

Keyword Driven Framework i Selenium

Låt oss titta på ett exempel:

Testscenario: Vi utför 2 testfall

objekt.egenskaper

url=https://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 körning ser utdata ut så här –

Keyword Driven Framework i Selenium

ladda ner Selenium Projektfiler för demon i denna handledning

Hybriddrivet ramverk

Hybriddrivet ramverk in Selenium är ett koncept där vi använder fördelen med både nyckelordsdrivet ramverk och datadrivet ramverk. Det är ett lättanvänt ramverk som tillåter manuella testare att skapa testfall genom att bara titta på nyckelord, testdata och objektförråd utan att koda i ramverket.

Här för nyckelord kommer vi att använda Excel-filer för att underhålla testfall, och för testdata kan vi använda data, leverantör av Testng ramverk.

Hybriddrivet ramverk

Här i vårt hybridramverk behöver vi inte ändra något i nyckelordsdrivet ramverk, här behöver vi bara ersätta filen ExecuteTest.java med filen HybridExecuteTest.java.

Hybriddrivet ramverk

Denna HybridExecuteTest-fil har all kod för nyckelordsdriven med dataleverantörskoncept.

Den kompletta bildrepresentationen av hybridramverket kommer att se ut

Hybriddrivet ramverk

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;    
    }
}

Sammanfattning

  • Vi kan skapa tre typer av testramverk med hjälp av Selenium WebDriver.
  • A Selenium automationsramverk som kan klassificeras i datadrivna, nyckelordsdrivna och hybridramar.
  • Vi kan uppnå datadrivet ramverk med hjälp av TestNGs dataleverantör.
  • I nyckelordsdrivet ramverk skrivs nyckelord i vissa externa filer som excel-fil och java-kod kommer att anropa denna fil och exekvera testfall.
  • Hybridramverket är en blandning av nyckelordsdrivet och datadrivet ramverk.

ladda ner Selenium Projektfiler för demon i denna handledning