Selenium Ramy: oparte na danych, słowach kluczowych i hybrydach
⚡ Inteligentne podsumowanie
Selenium Framework: Podejścia oparte na danych, słowach kluczowych i hybrydach definiują sposób, w jaki testerzy organizują kod automatyzacji, oddzielają dane testowe i ponownie wykorzystują logikę. W tym artykule wyjaśniono każdy typ frameworka, jego architekturę, zalety oraz sposób ich implementacji krok po kroku, z praktycznymi wskazówkami. Selenium Przykłady kodu WebDriver.

Czym jest Selenium Struktura?
Selenium Ramy automatyzacji to ustrukturyzowana architektura kodu, która sprawia, że utrzymanie testów jest proste, skalowalne i wydajne. Bez frameworka testerzy często umieszczają kod i dane w tym samym miejscu, co nie jest ani wielokrotnego użytku, ani czytelne. Wdrożenie frameworka przynosi wymierne korzyści, takie jak większa możliwość ponownego wykorzystania kodu, lepsza przenośność, niższe koszty utrzymania skryptów, lepsza czytelność oraz wyraźniejszy podział zagadnień między logiką testów a danymi wejściowymi.
Dlaczego warto korzystać z Selenium Struktura automatyzacji?
Dobrze zaprojektowany Selenium Framework rozwiązuje trzy uporczywe problemy w automatyzacji testów: duplikację kodu, niestabilne lokalizatory i trudne do zarządzania dane testowe. Wymuszając jasną strukturę, zespoły mogą skalować swoje pakiety z kilku skryptów do setek bez utraty kontroli.
- Łatwość konserwacji: Centralne lokalizatory i metody pomocnicze oznaczają, że pojedyncza zmiana aktualizuje każdy test wykorzystujący dany element.
- Możliwość ponownego wykorzystania: Typowe operacje, takie jak logowanie, nawigacja czy wypełnianie formularzy, są zapisywane raz i wywoływane w wielu przypadkach testowych.
- Skalowalność: Dodawanie nowych przypadków testowych staje się aktualizacją danych, a nie zadaniem kodowania, co pozwala osobom niebędącym programistami na dodawanie scenariuszy.
- Sprawozdawczość i współpraca: Standaryzowana struktura ułatwia integrację z narzędziami do raportowania, procesami CI/CD i kontrolą wersji.
Rodzaje Selenium
Istnieją trzy podstawowe rodzaje ram zbudowany na Selenium WebDriver do automatyzacji ręcznych przypadków testowych. Każdy styl koncentruje się na innej równowadze między wysiłkiem programistów, zaangażowaniem testerów i elastycznością danych.
- Struktura oparta na danych
- Struktura oparta na słowach kluczowych
- Struktura oparta na hybrydzie
W kolejnych sekcjach szczegółowo wyjaśnimy każdą z ram, zaczynając od najprostszego podejścia opartego na danych, a kończąc na najelastyczniejszym modelu hybrydowym.
Struktura oparta na danych w Selenium
Struktura oparta na danych w Selenium to metoda oddzielania zestawów danych testowych od logiki przypadków testowych. Po oddzieleniu danych można modyfikować dane wejściowe dla konkretnej funkcjonalności bez ingerencji w kod testowy. Jest ona powszechnie używana do pobierania przypadków testowych i pakietów testowych ze źródeł zewnętrznych, takich jak: przewyższać, .csv, .xml lub tabele baz danych.
Do odczytu i zapisu plików Excela Apache udostępnia znaną bibliotekę POI. Biblioteka ta obsługuje oba te typy plików. XLS oraz XLSX formaty. The HSSF implementacja odczytuje starsze pliki XLS, podczas gdy XSSF Implementacja obsługuje nowoczesne pliki XLSX.
O testowaniu opartym na danych pisaliśmy już w naszym poprzedni samouczek.
Struktura oparta na słowach kluczowych w Selenium
Struktura oparta na słowach kluczowych w Selenium To metoda przyspieszająca automatyzację poprzez oddzielenie słów kluczowych dla typowych funkcji i instrukcji. Wszystkie operacje i instrukcje są zapisywane w pliku zewnętrznym, zazwyczaj arkuszu Excela. Testerzy mogą określić funkcjonalności, które chcą zweryfikować, bez konieczności ich modyfikowania. Java kodu, co sprawia, że styl ten idealnie nadaje się dla zespołów, w których analitycy biznesowi lub pracownicy ds. zapewnienia jakości ręcznie dostarczają definicje testów.
Oto jak wygląda kompletny framework:
Jak widać, jest to struktura składająca się z 5 kroków. Przyjrzyjmy się jej szczegółowo krok po kroku.
Krok 1)
- Skrypt sterownika Execute.java wywołuje funkcję ReadGuru99PlikExcel.java.
- CzytajGuruPlik 99ExcelFile.java zawiera kod POI, który odczytuje dane z programu Excel.
Krok 2)
- CzytajGuru99ExcelFile.java odczytuje dane z TestCase.xlsx.
- Oto jak wygląda arkusz:
- Na podstawie słów kluczowych zapisanych w pliku Excel, struktura wykonuje odpowiednią akcję w interfejsie użytkownika.
- Na przykład, aby kliknąć przycisk oznaczony jako „Zaloguj się”, arkusz Excela zapisuje słowo kluczowe „Kliknij”. Aby zidentyfikować przycisk „Zaloguj się” wśród wielu na stronie, wiersz Excela definiuje nazwę obiektu jako loginButton, a typ obiektu jako nazwę (patrz zaznaczony wiersz na obrazku). Typ obiektu może również być XPath, CSS, klasą lub dowolną inną strategią lokalizacyjną.
Krok 3) CzytajGuru99ExcelFile.java przekazuje przeanalizowane dane z powrotem do skryptu sterownika Execute.java.
Krok 4)
- Dla wszystkich elementów interfejsu użytkownika w sieci WWW utrzymujesz repozytorium obiektów, w którym przechowywane są lokalizatory elementów, takie jak XPath, nazwa, CSS lub nazwa klasy.
- Execute.java (skrypt sterownika) odczytuje całe repozytorium obiektów i zapisuje je w zmiennej.
- Klasa pomocnicza ReadObject udostępnia metodę getObjectRepository, która ładuje repozytorium w czasie wykonywania.
UWAGA: Możesz się zastanawiać, dlaczego potrzebne jest repozytorium obiektów. Odpowiedzią jest łatwość utrzymania. Jeśli przycisk o nazwie btnlogin zostanie użyty w 10 przypadkach testowych, a programista zmieni jego nazwę na submit, w przeciwnym razie edytowałbyś 10 plików. W repozytorium obiektów lokalizator zmienia się w jednym miejscu.
Krok 5)
- Sterownik przekazuje dane z programu Excel i repozytorium obiektów do interfejsu użytkownikaOperaklasa cji.
- UIOperaZawiera funkcje, które mapują każde słowo kluczowe, takie jak CLICK i SETTEXT, na konkretną akcję WebDriver.
- UIOperacja jest Java Klasa zawierająca rzeczywistą implementację umożliwiającą interakcję z elementami sieciowymi.
Pełna struktura projektu wygląda następująco:
Przyjrzyjmy się praktycznemu przykładowi:
Scenariusz testowy: Wykonujemy 2 przypadki testowe.
- Przypadek testowy 1:
- Iść do
https://demo.guru99.com/V4/ - Wprowadź identyfikator użytkownika
- Wprowadź hasło
- Kliknij Resetuj
- Przypadek testowy 2:
- Iść do
https://demo.guru99.com/V4/ - Wprowadź identyfikator użytkownika
- Wprowadź hasło
- Kliknij Login
obiekt.właściwości
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
CzytajGuru99PlikExcel.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;
}
}
PrzeczytajObject.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;
}
}
UIOperacja.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");
}
}
}
Wykonaj 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");
}
}
}
}
Po wykonaniu wyjście wygląda następująco:
Pobierz Selenium Pliki projektu dla wersji demonstracyjnej w tym samouczku
Struktura oparta na hybrydzie
Struktura oparta na hybrydzie in Selenium Łączy zalety frameworków Keyword Driven i Data Driven. Jest to łatwy w użyciu model, który pozwala testerom manualnym tworzyć przypadki testowe poprzez prostą edycję słów kluczowych, danych testowych i repozytorium obiektów, bez konieczności pisania kodu frameworka.
W tym przypadku pliki Excela przechowują słowa kluczowe dla każdego kroku i TestNG'S dostawca danych dostarcza dane testowe. Ten podział pozwala na niezależne skalowanie zarówno słownika działań, jak i wariantów wejściowych.
W przypadku naszego hybrydowego środowiska nie wprowadzamy żadnych zmian w strukturze opartej na słowach kluczowych: po prostu zastępujemy ExecuteTest.java plikiem HybridExecuteTest.java.
Ten plik HybridExecuteTest zawiera pełną logikę sterowaną słowami kluczowymi połączoną z TestNGmechanizm dostarczania danych.
Pełna reprezentacja graficzna hybrydowego frameworka wygląda następująco:
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 {
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;
}
}
Pobierz Selenium Pliki projektu dla wersji demonstracyjnej w tym samouczku












