Что такое 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 для демонстрации в этом уроке