Учебники

38) Создать Framework Key & Hybrid

Что такое Selenium Framework?

Selenium Framework — это структура кода, которая помогает упростить сопровождение кода. Без фреймворков мы поместим «код» и «данные» в одно и то же место, которое нельзя ни использовать повторно, ни читать. Используя Frameworks, вы получите полезные результаты, такие как увеличение повторного использования кода, повышение переносимости, снижение затрат на обслуживание сценариев, повышение читабельности кода и т. Д.

В основном Selenium WebDriver создает три типа фреймворков для автоматизации тестовых случаев вручную.

  • Механизм тестирования данных
  • Ключевое слово Driven Test Framework
  • Гибридный тестовый фреймворк

Selenium Framework: ключевое слово, управляемое и гибридное

Механизм тестирования данных

В  среде, управляемой данными, все наши тестовые данные генерируются из некоторых внешних файлов, таких как Excel , CSV, XML или таблицы базы данных.

Чтение и запись данных из файла Excel в веб-драйвере Selenium: POI & JXL

Для чтения или записи Excel Apache предоставляет очень известную библиотеку POI. Эта библиотека достаточно способна для чтения и записи файлов формата XLS и XLSX в Excel.

Чтобы читать файлы XLS , библиотека POI предоставляет реализацию HSSF .

Чтобы читать XLSX, XSSF реализация библиотеки POI будет выбором. Давайте изучим эти реализации подробно.

Мы уже узнали о Data Driven Testing в нашем предыдущем уроке

Механизм тестирования по ключевым словам:

В тестовой среде, управляемой ключевыми словами, все операции и инструкции записываются в каком-то внешнем файле, например в листе Excel. Вот как выглядит полная структура

Selenium Framework: ключевое слово, управляемое и гибридное

Как вы можете видеть, это 5-ступенчатая структура. Давайте изучим это поэтапно в деталях

Шаг 1)

  • Сценарий драйвера Execute.java будет вызывать ReadGuru99ExcelFile.java
  • ReadGuru99ExcelFile.java имеет скрипт POI для чтения данных из Excel

Шаг 2)

  • ReadGuru99ExcelFile.java будет читать данные из TestCase.xlsx
  • Вот как выглядит лист:

Selenium Framework: ключевое слово, управляемое и гибридное

  • Согласно ключевым словам, написанным в файле Excel, фреймворк будет выполнять операцию над пользовательским интерфейсом.
  • Например, нам нужно нажать кнопку «Войти». Соответственно, в нашем Excel будет ключевое слово «Клик». Теперь AUT может иметь сотни кнопок на странице, чтобы идентифицировать кнопку входа, в Excel мы будем вводить имя объекта как loginButton и тип объекта как имя (см. Выделенную строку на изображении выше). Тип объекта может быть Xpath, имя CSS или любое другое значение

Шаг 3) ReadGuru99ExcelFile.java передаст эти данные в скрипт драйвера Execute.java

Шаг 4)

  • Для всех наших веб-элементов пользовательского интерфейса нам нужно создать хранилище объектов, в которое мы поместим локатор их элементов (например, Xpath, имя, путь CSS, имя класса и т. Д.).

Selenium Framework: ключевое слово, управляемое и гибридное

  • Execute.java (наш скрипт драйвера) прочитает весь репозиторий объектов и сохранит его в переменной
  • Чтобы прочитать этот репозиторий объектов, нам нужен класс ReadObject, у которого есть метод getObjectRepository для его чтения.

    Selenium Framework: ключевое слово, управляемое и гибридное

ПРИМЕЧАНИЕ. Вы можете подумать, зачем нам создавать хранилище объектов. Ответ помогает в обслуживании кода. Например, мы используем кнопку с именем = btnlogin в 10 различных тестовых случаях. В будущем разработчик решает изменить имя с btnlogin для отправки. Вам нужно будет внести изменения во все 10 тестовых случаев. В случае с хранилищем объектов вы вносите изменения только один раз в хранилище.

Шаг 5)

  • Драйвер передает данные из Excel и Object Repository в класс UIOperation
  • Класс UIOperation имеет функции для выполнения действий, соответствующих ключевым словам, таким как CLICK, SETTEXT и т. Д., Упомянутым в Excel.
  • Класс UIOperation — это класс Java, который имеет фактическую реализацию кода для выполнения операций над веб-элементами.

Selenium Framework: ключевое слово, управляемое и гибридное

Весь проект будет выглядеть как

Selenium Framework: ключевое слово, управляемое и гибридное

Давайте посмотрим на пример:

Тестовый сценарий

  • Мы выполняем 2 теста
  • Тестовый пример 1:
  • Перейти к  http://demo.guru99.com/V4/
  • Введите идентификатор пользователя
  • Введите пароль
  • Нажмите Сброс
  • Тестовый пример 2:
  • Перейти к  http://demo.guru99.com/V4/
  • Введите идентификатор пользователя
  • Введите пароль
  • Нажмите Войти

object.properties

url = http://demo.guru99.com/V4/

имя пользователя = UID

пароль = пароль

название = 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");
            }
        }
    }
}

После выполнения вывод будет выглядеть так:

Selenium Framework: ключевое слово, управляемое и гибридное

Загрузите файлы проекта Selenium для демонстрации в этом уроке

Гибридный тестовый фреймворк

Гибридный каркас тестирования — это концепция, в которой мы используем преимущество как ключевого слова, так и среды, управляемой данными.

Здесь для ключевых слов мы будем использовать файлы Excel для поддержки тестовых случаев, а для тестовых данных мы можем использовать данные, предоставленные каркасом Testng .

Selenium Framework: ключевое слово, управляемое и гибридное

Здесь, в нашей гибридной среде, нам не нужно ничего менять в среде, управляемой ключевыми словами, здесь нам просто нужно заменить файл ExecuteTest.java файлом HybridExecuteTest.java.

Selenium Framework: ключевое слово, управляемое и гибридное

Этот файл HybridExecuteTest содержит весь код для ключевого слова, основанный на концепции поставщика данных.

Полное графическое представление гибридного каркаса будет выглядеть так

Selenium Framework: ключевое слово, управляемое и гибридное

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

 

Резюме:

  • Мы можем создать три типа тестовой среды, используя Selenium WebDriver.
  • Это Data Driven, Keyword Driven и Hybrid Test Framework.
  • Мы можем создать управляемую данными инфраструктуру с помощью поставщика данных TestNG.
  • В платформе, управляемой ключевыми словами, ключевые слова записываются в некоторые внешние файлы, такие как файл Excel, и код Java будет вызывать этот файл и выполнять контрольные примеры.
  • Гибридный фреймворк представляет собой сочетание фреймворка, управляемого ключевыми словами и данными.

Загрузите файлы проекта Selenium для демонстрации в этом уроке