Selenium Структура: данные, ключевые слова и гибридный подход
⚡ Умное резюме
Selenium Фреймворки: подходы, основанные на данных, ключевых словах и гибридном подходе, определяют, как тестировщики организуют код автоматизации, разделяют тестовые данные и повторно используют логику. В этой статье объясняется каждый тип фреймворка, его архитектура, преимущества и пошаговое руководство по их внедрению на практике. Selenium Примеры кода WebDriver.
Что такое Selenium Рамки?
Selenium Платформа автоматизации Это структурированная архитектура кода, которая делает поддержку тестов простой, масштабируемой и эффективной. Без фреймворка тестировщики часто размещают код и данные в одном и том же месте, что не обеспечивает ни повторного использования, ни читаемости. Внедрение фреймворка обеспечивает измеримые преимущества, такие как более высокая степень повторного использования кода, лучшая переносимость, снижение затрат на поддержку скриптов, улучшенная читаемость и более четкое разделение задач между логикой тестирования и входными данными.
Зачем использовать Selenium Фреймворк автоматизации?
Хорошо продуманный Selenium Этот фреймворк решает три распространённые проблемы автоматизации тестирования: дублирование кода, ненадежные локаторы и неуправляемые тестовые данные. Благодаря четкой структуре команды могут масштабировать свои наборы тестов от нескольких скриптов до сотен, не теряя контроля.
- Ремонтопригодность: Централизованные локаторы и вспомогательные методы означают, что одно изменение обновляет каждый тест, использующий этот элемент.
- Возможность повторного использования: Типичные операции, такие как вход в систему, навигация или ввод данных в форму, пишутся один раз и вызываются во множестве тестовых случаев.
- Масштабируемость. Добавление новых тестовых случаев превращается из задачи по написанию кода в обновление данных, что позволяет людям, не являющимся разработчиками, вносить свой вклад в создание сценариев.
- Отчетность и сотрудничество: Стандартизированная структура упрощает интеграцию с инструментами отчетности, конвейерами CI/CD и системами контроля версий.
Виды Selenium Рамки
Есть три основных типы фреймворков построен на Selenium WebDriver для автоматизации ручных тестовых случаев. Каждый стиль направлен на достижение различного баланса между усилиями разработчиков, участием тестировщиков и гибкостью данных.
- Платформа, управляемая данными
- Фреймворк, управляемый ключевыми словами
- Гибридная платформа
В следующих разделах подробно объясняется каждая из предложенных моделей, начиная с простейшего подхода, основанного на данных, и заканчивая наиболее гибкой гибридной моделью.
Data Driven Framework в Selenium
Data Driven Framework в Selenium Это метод разделения наборов тестовых данных от логики тестового примера. После разделения данных можно изменять входные данные для конкретной функциональности, не затрагивая код теста. Он часто используется для получения тестовых примеров и наборов из внешних источников, таких как... Excel, .csv, .xml или таблицы базы данных.
Для чтения и записи файлов Excel Apache предоставляет хорошо известную библиотеку POI. Эта библиотека поддерживает оба варианта обработки. XLS и XLSX форматы. ХССФ реализация считывает устаревшие файлы XLS, в то время как XSSF Реализация поддерживает современные файлы XLSX.
Мы уже рассматривали тестирование, основанное на данных, в нашем предыдущем обзоре. предыдущий учебник.
Платформа, управляемая ключевыми словами, в Selenium
Платформа, управляемая ключевыми словами, в Selenium Это метод, ускоряющий автоматизацию за счет разделения ключевых слов для общих функций и инструкций. Все операции и инструкции записываются во внешний файл, обычно в электронную таблицу Excel. Тестировщики могут указать функции, которые они хотят проверить, без внесения изменений в исходный код. Java код, что делает этот стиль идеальным для команд, где бизнес-аналитики или специалисты по ручному тестированию вносят свой вклад в определение тестов.
Вот как выглядит вся структура в целом:
Как видите, это пятиэтапная схема. Давайте рассмотрим её пошагово подробно.
Шаг 1)
- Скрипт драйвера Execute.java вызывает функцию Read.Guru99ExcelFile.java.
- ЧитатьGuruФайл 99ExcelFile.java содержит код POI, который считывает данные из Excel.
Шаг 2)
- ЧитатьGuruФайл 99ExcelFile.java считывает данные из файла TestCase.xlsx.
- Вот как выглядит этот лист:
- На основе ключевых слов, записанных в файле Excel, фреймворк выполняет соответствующее действие в пользовательском интерфейсе.
- Например, чтобы нажать кнопку с надписью «Войти», в таблице Excel хранится ключевое слово «Click». Для идентификации кнопки «Войти» среди множества других кнопок на странице в строке Excel задается имя объекта как loginButton и тип объекта как name (см. выделенную строку на изображении). Тип объекта также может быть XPath, CSS, class или любой другой стратегией поиска.
Шаг 3) ЧитатьGuruФайл 99ExcelFile.java передает обработанные данные обратно в скрипт драйвера Execute.java.
Шаг 4)
- Для всех элементов веб-интерфейса вы поддерживаете репозиторий объектов, в котором хранятся указатели элементов, такие как XPath, имя, CSS или имя класса.
- Скрипт Execute.java (драйверный скрипт) считывает весь репозиторий объектов и сохраняет его в переменной.
- Вспомогательный класс ReadObject предоставляет метод getObjectRepository, который загружает репозиторий во время выполнения.
ПРИМЕЧАНИЕ: Возможно, вы задаетесь вопросом, зачем нужен репозиторий объектов. Ответ прост: он упрощает сопровождение. Если кнопка с именем `btnlogin` используется в 10 тестовых случаях, и разработчик переименовывает её в `submit`, вам пришлось бы редактировать 10 файлов. С репозиторием объектов вы меняете локатор в одном месте.
Шаг 5)
- Драйвер передает данные из Excel и репозитория объектов в пользовательский интерфейс.Operaкласс.
- UIOperaФункция `tion` сопоставляет каждое ключевое слово, такое как `CLICK` и `SETTEXT`, с конкретным действием WebDriver.
- UIOperaция — это Java Класс, содержащий реальную реализацию взаимодействия с веб-элементами.
Полная структура проекта выглядит следующим образом:
Рассмотрим практический пример:
Сценарий тестирования: Мы выполняем 2 тестовых случая.
- Тестовый пример 1:
- Идти к
https://demo.guru99.com/V4/ - Введите идентификатор пользователя
- Введите пароль
- Нажмите Сбросить
- Тестовый пример 2:
- Идти к
https://demo.guru99.com/V4/ - Введите идентификатор пользователя
- Введите пароль
- Нажмите Войти
объект.свойства
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
ЧитатьGuru99ExcelFile.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 File object to open the xlsx file
File file = new File(filePath + "\\" + fileName);
// Create a FileInputStream to read the Excel file
FileInputStream inputStream = new FileInputStream(file);
Workbook guru99Workbook = null;
// Detect the file extension
String fileExtensionName = fileName.substring(fileName.indexOf("."));
if (fileExtensionName.equals(".xlsx")) {
guru99Workbook = new XSSFWorkbook(inputStream);
} else if (fileExtensionName.equals(".xls")) {
guru99Workbook = new HSSFWorkbook(inputStream);
}
// Read the sheet inside the workbook by its name
Sheet guru99Sheet = guru99Workbook.getSheet(sheetName);
return guru99Sheet;
}
}
ЧитатьОбъект.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 the 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":
driver.findElement(this.getObject(p, objectName, objectType)).click();
break;
case "SETTEXT":
driver.findElement(this.getObject(p, objectName, objectType)).sendKeys(value);
break;
case "GOTOURL":
driver.get(p.getProperty(value));
break;
case "GETTEXT":
driver.findElement(this.getObject(p, objectName, objectType)).getText();
break;
default:
break;
}
}
private By getObject(Properties p, String objectName, String objectType) throws Exception {
if (objectType.equalsIgnoreCase("XPATH")) {
return By.xpath(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("CLASSNAME")) {
return By.className(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("NAME")) {
return By.name(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("CSS")) {
return By.cssSelector(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("LINK")) {
return By.linkText(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("PARTIALLINK")) {
return By.partialLinkText(p.getProperty(objectName));
} else {
throw new Exception("Wrong object type");
}
}
}
ВыполнитьTest.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 {
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 the number of rows in the Excel file
int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
for (int i = 1; i < rowCount + 1; i++) {
Row row = guru99Sheet.getRow(i);
if (row.getCell(0).toString().length() == 0) {
System.out.println(row.getCell(1).toString() + "----" + row.getCell(2).toString() + "----" +
row.getCell(3).toString() + "----" + row.getCell(4).toString());
operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
row.getCell(3).toString(), row.getCell(4).toString());
} else {
System.out.println("New Testcase->" + row.getCell(0).toString() + " Started");
}
}
}
}
После выполнения вывод будет выглядеть следующим образом:
Скачать Selenium Файлы проекта для демонстрации в этом руководстве
Гибридная платформа
Гибридная платформа in Selenium Сочетает в себе сильные стороны как фреймворков, ориентированных на ключевые слова, так и фреймворков, ориентированных на данные. Это простая в использовании модель, позволяющая тестировщикам вручную создавать тестовые случаи, просто редактируя ключевые слова, тестовые данные и репозиторий объектов, без написания какого-либо кода фреймворка.
Здесь в файлах Excel хранятся ключевые слова для каждого этапа, и TestNGАвтора поставщик данных Предоставляет тестовые данные. Такое разделение позволяет масштабировать как словарь действий, так и варианты входных данных независимо друг от друга.
В нашей гибридной среде структура, основанная на ключевых словах, остается неизменной: мы просто заменяем ExecuteTest.java на HybridExecuteTest.java.
Этот файл HybridExecuteTest содержит полную логику, управляемую ключевыми словами, в сочетании с TestNGмеханизм поставщика данных.
Полное графическое представление гибридной структуры выглядит следующим образом:
ГибридExecuteTest.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 {
if (testcaseName != null && testcaseName.length() != 0) {
webdriver = new FirefoxDriver();
}
ReadObject object = new ReadObject();
Properties allObjects = object.getObjectRepository();
UIOperation operation = new UIOperation(webdriver);
operation.perform(allObjects, keyword, objectName, objectType, value);
}
@DataProvider(name = "hybridData")
public Object[][] getDataFromDataprovider() throws IOException {
Object[][] object = null;
ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
object = new Object[rowCount][5];
for (int i = 0; i < rowCount; i++) {
Row row = guru99Sheet.getRow(i + 1);
for (int j = 0; j < row.getLastCellNum(); j++) {
object[i][j] = row.getCell(j).toString();
}
}
System.out.println("");
return object;
}
}
Скачать Selenium Файлы проекта для демонстрации в этом руководстве













