Что такое Selenium Framework?
Selenium Framework — это структура кода, которая помогает упростить сопровождение кода. Без фреймворков мы поместим «код» и «данные» в одно и то же место, которое нельзя ни использовать повторно, ни читать. Используя Frameworks, вы получите полезные результаты, такие как увеличение повторного использования кода, повышение переносимости, снижение затрат на обслуживание сценариев, повышение читабельности кода и т. Д.
В основном Selenium WebDriver создает три типа фреймворков для автоматизации тестовых случаев вручную.
- Механизм тестирования данных
- Ключевое слово Driven Test Framework
- Гибридный тестовый фреймворк
Механизм тестирования данных
В среде, управляемой данными, все наши тестовые данные генерируются из некоторых внешних файлов, таких как Excel , CSV, XML или таблицы базы данных.
Для чтения или записи Excel Apache предоставляет очень известную библиотеку POI. Эта библиотека достаточно способна для чтения и записи файлов формата XLS и XLSX в Excel.
Чтобы читать файлы XLS , библиотека POI предоставляет реализацию HSSF .
Чтобы читать XLSX, XSSF реализация библиотеки POI будет выбором. Давайте изучим эти реализации подробно.
Мы уже узнали о Data Driven Testing в нашем предыдущем уроке
Механизм тестирования по ключевым словам:
В тестовой среде, управляемой ключевыми словами, все операции и инструкции записываются в каком-то внешнем файле, например в листе Excel. Вот как выглядит полная структура
Как вы можете видеть, это 5-ступенчатая структура. Давайте изучим это поэтапно в деталях
Шаг 1)
- Сценарий драйвера Execute.java будет вызывать ReadGuru99ExcelFile.java
- ReadGuru99ExcelFile.java имеет скрипт POI для чтения данных из Excel
Шаг 2)
- ReadGuru99ExcelFile.java будет читать данные из TestCase.xlsx
- Вот как выглядит лист:
- Согласно ключевым словам, написанным в файле Excel, фреймворк будет выполнять операцию над пользовательским интерфейсом.
- Например, нам нужно нажать кнопку «Войти». Соответственно, в нашем Excel будет ключевое слово «Клик». Теперь AUT может иметь сотни кнопок на странице, чтобы идентифицировать кнопку входа, в Excel мы будем вводить имя объекта как loginButton и тип объекта как имя (см. Выделенную строку на изображении выше). Тип объекта может быть Xpath, имя CSS или любое другое значение
Шаг 3) ReadGuru99ExcelFile.java передаст эти данные в скрипт драйвера Execute.java
Шаг 4)
- Для всех наших веб-элементов пользовательского интерфейса нам нужно создать хранилище объектов, в которое мы поместим локатор их элементов (например, Xpath, имя, путь CSS, имя класса и т. Д.).
- Execute.java (наш скрипт драйвера) прочитает весь репозиторий объектов и сохранит его в переменной
-
Чтобы прочитать этот репозиторий объектов, нам нужен класс ReadObject, у которого есть метод getObjectRepository для его чтения.
ПРИМЕЧАНИЕ. Вы можете подумать, зачем нам создавать хранилище объектов. Ответ помогает в обслуживании кода. Например, мы используем кнопку с именем = btnlogin в 10 различных тестовых случаях. В будущем разработчик решает изменить имя с btnlogin для отправки. Вам нужно будет внести изменения во все 10 тестовых случаев. В случае с хранилищем объектов вы вносите изменения только один раз в хранилище.
Шаг 5)
- Драйвер передает данные из Excel и Object Repository в класс UIOperation
- Класс UIOperation имеет функции для выполнения действий, соответствующих ключевым словам, таким как CLICK, SETTEXT и т. Д., Упомянутым в Excel.
- Класс UIOperation — это класс Java, который имеет фактическую реализацию кода для выполнения операций над веб-элементами.
Весь проект будет выглядеть как
Давайте посмотрим на пример:
Тестовый сценарий
- Мы выполняем 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 для демонстрации в этом уроке
Гибридный тестовый фреймворк
Гибридный каркас тестирования — это концепция, в которой мы используем преимущество как ключевого слова, так и среды, управляемой данными.
Здесь для ключевых слов мы будем использовать файлы 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.
- Это Data Driven, Keyword Driven и Hybrid Test Framework.
- Мы можем создать управляемую данными инфраструктуру с помощью поставщика данных TestNG.
- В платформе, управляемой ключевыми словами, ключевые слова записываются в некоторые внешние файлы, такие как файл Excel, и код Java будет вызывать этот файл и выполнять контрольные примеры.
- Гибридный фреймворк представляет собой сочетание фреймворка, управляемого ключевыми словами и данными.
Загрузите файлы проекта Selenium для демонстрации в этом уроке











