Содержание:
- Что такое фреймворк автоматизации Selenium?
- Типы фреймворков Selenium
- Фреймворк, управляемый данными (Data Driven Framework)
- Фреймворк, управляемый ключевыми словами (Keyword Driven Framework)
- Гибридный фреймворк
Что такое фреймворк автоматизации Selenium?
Фреймворк автоматизации Selenium – это структура кода, которая делает его обслуживание простым и эффективным. Без фреймворков пользователи могут размещать “код” и “данные” в одном и том же месте, которые в результате будут ни пригодными для повторного использования, ни читаемыми. Фреймворки помогают повысить возможности повторного использования кода, увеличить его переносимость, упростить сопровождение скриптов, улучшить читаемость кода и т.д.
Типы фреймворков Selenium
Существует три основных типа фреймворков, созданных Selenium WebDriver для автоматизации ручных тест-кейсов:
- Фреймворк, управляемый данными.
- Фреймворк, управляемый ключевыми словами.
- Гибридный фреймворк.
БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале "Библиотека тестировщика"
Фреймворк, управляемый данными (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».