Содержание:
- Что такое фреймворк автоматизации Selenium?
- Типы фреймворков Selenium
- Фреймворк, управляемый данными (Data Driven Framework)
- Фреймворк, управляемый ключевыми словами (Keyword Driven Framework)
- Гибридный фреймворк
Что такое фреймворк автоматизации Selenium?
Фреймворк автоматизации Selenium — это структура кода, которая делает его обслуживание простым и эффективным. Без фреймворков пользователи могут размещать «код» и «данные» в одном и том же месте, которые в результате будут ни пригодными для повторного использования, ни читаемыми. Фреймворки помогают повысить возможности повторного использования кода, увеличить его переносимость, упростить сопровождение скриптов, улучшить читаемость кода и т.д.
Типы фреймворков Selenium
Существует три основных типа фреймворков, созданных Selenium WebDriver для автоматизации ручных тест-кейсов:
- Фреймворк, управляемый данными.
- Фреймворк, управляемый ключевыми словами.
- Гибридный фреймворк.

Друзья, поддержите нас вступлением в наш телеграм канал QaRocks. Там много туториалов, задач по автоматизации и книг по QA.
Фреймворк, управляемый данными (Data Driven Framework)
Фреймворк, управляемый данными (Data Driven Framework) в Selenium — это метод отделения наборов данных от тест-кейса. Когда наборы данных отделены от теста, их можно легко модифицировать для конкретной функциональности без изменения кода. Этот метод используется для получения тест-кейсов и наборов данных из внешних файлов, таких как Excel, .csv, .xml или таблиц некоторых баз данных.
Для чтения и записи Excel в Apache предусмотрена очень известная библиотека POI. Эта библиотека способна читать и записывать файлы Excel в форматах XLS и XLSX.
Для чтения файлов XLS библиотека POI предоставляет реализацию HSSF.
Для чтения XLSX подойдет реализация XSSF библиотеки POI.
Фреймворк, управляемый ключевыми словами (Keyword Driven Framework)
Keyword Driven Framework в Selenium — это метод, используемый для ускорения автоматизированного тестирования путем выделения ключевых слов для общего набора функций и инструкций. Все операции и инструкции, которые необходимо выполнить, записываются во внешнем файле, например, в листе Excel. Пользователи могут легко контролировать и указывать функции, которые они хотят протестировать.
Вот как выглядит готовый фреймворк:

Как видите, это 5-шаговая схема. Рассмотрим ее подробно:
Шаг 1)
- Сценарий драйвера Execute.java вызовет файл ReadGuru99ExcelFile.java.
- ReadGuru99ExcelFile.java содержит POI-скрипт для чтения данных из Excel.
Шаг 2)
- ReadGuru99ExcelFile.java будет считывать данные из файла TestCase.xlsx.
- Вот как выглядит лист:

- В соответствии с ключевыми словами, записанными в файле Excel, фреймворк выполнит операцию над пользовательским интерфейсом.
- Например, нам нужно нажать кнопку ‘Вход в систему’. Соответственно, в нашем Excel будет ключевое слово ‘Click’. Теперь на тестируемой странице (AUT) могут быть сотни кнопок. Чтобы идентифицировать кнопку Login, мы введем в Excel имя объекта loginButton & тип объекта в качестве имени (см. выделенную строку на рисунке выше). Тип объекта может быть Xpath, имя CSS или любое другое значение.
Шаг 3) ReadGuru99ExcelFile.java передаст эти данные скрипту драйвера Execute.java.
Шаг 4)
- Для всех наших веб-элементов пользовательского интерфейса необходимо создать хранилище объектов, в котором мы будем размещать их локатор элемента (например, Xpath, имя, CSS-путь, имя класса и т.д.).

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

ПРИМЕЧАНИЕ: Вы можете подумать, зачем нам нужно создавать хранилище объектов. Ответ — для сопровождения кода. Например, мы используем кнопку с именем = btnlogin в 10 различных тестовых случаях. В будущем разработчик решает изменить имя с btnlogin на submit. Придется внести изменения во все 10 тест-кейсов. В случае объектного хранилища изменение производится только один раз в самом хранилище.
Шаг 5)
- Драйвер будет передавать данные из Excel & Object Repository в класс UIOperation.
- Класс UIOperation имеет функции для выполнения действий, соответствующих ключевым словам CLICK, SETTEXT и т.д…, упомянутым в Excel.
- Класс UIOperation — это Java-класс, имеющий фактическую реализацию кода для выполнения операций над веб-элементами

Завершенный проект будет выглядеть следующим образом:

Рассмотрим пример:
Сценарий тестирования: Мы выполняем 2 тестовых случая
Тестовый пример 1:
- Перейти на сайт https://demo.guru99.com/V4/.
- Ввести идентификатор пользователя.
- Ввести пароль.
- Нажать кнопку «Сбросить».
Тестовый пример 2:.
- Перейти на сайт https://demo.guru99.com/V4/.
- Ввести идентификатор пользователя.
- Ввести пароль.
- Нажать кнопку «Войти».
object.properties
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");
}
}
}
}
После выполнения вывод будет выглядеть следующим образом:

Download the Selenium Project Files for the Demo in this Tutorial
Гибридный фреймворк
Гибридный фреймворк в Selenium — это концепция, в которой мы используем преимущества двух фреймворков — управляемого ключевыми словами, так и управляемого данными. Он прост в использовании и позволяет ручным тестировщикам создавать тест-кейсы, просто просматривая ключевые слова, тестовые данные и репозиторий объектов без кодирования.
В этом примере для ключевых слов мы будем использовать файлы Excel для ведения тест-кейсов, а для тестовых данных можно использовать данные, предоставляемые фреймворком Testng.

Нам не нужно вносить изменения в фреймворк, управляемый данными. Мы должны просто заменить файл ExecuteTest.java на HybridExecuteTest.java.

В файле HybridExecuteTest содержится весь код для управления по ключевым словам с использованием концепции поставщика данных.
Полное наглядное представление гибридного фреймворка будет выглядеть следующим образом:

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 мы можем создать три типа тестовых фреймворков.
- Фреймворк автоматизации Selenium можно классифицировать на три типа — Data Driven, Keyword Driven и гибридный.
- Мы можем реализовать фреймворк Data-driven, используя провайдер данных TestNG.
- В фреймворке Keyword driven ключевые слова записываются в некоторые внешние файлы, например в файл excel, и java-код вызывает этот файл и выполняет тест-кейсы.
- Гибридный фреймворк представляет собой смесь двух фреймворков — управляемого ключевыми словами и управляемого данными.
Загрузите файлы проекта Selenium для демонстрации в этом учебном пособии
Перевод статьи «Selenium Framework: Data, Keyword & Hybrid Driven».