Selenium Framework : données, mots clés et hybride
⚡ Résumé intelligent
Selenium Cadres de référence : Les approches pilotées par les données, par mots-clés et hybrides définissent la manière dont les testeurs organisent le code d’automatisation, séparent les données de test et réutilisent la logique. Cet article explique chaque type de cadre, son architecture, ses avantages et comment les implémenter étape par étape avec des exemples pratiques. Selenium Exemples de code WebDriver.

Qu'est-ce que le Selenium Cadre?
Le Selenium Cadre d'automatisation Il s'agit d'une architecture de code structurée qui simplifie, optimise et rend plus évolutive la maintenance des tests. Sans framework, les testeurs placent souvent le code et les données au même endroit, ce qui les rend difficilement réutilisables et lisibles. L'adoption d'un framework apporte des avantages concrets : une meilleure réutilisabilité du code, une portabilité accrue, des coûts de maintenance des scripts réduits, une lisibilité améliorée et une séparation plus claire des responsabilités entre la logique de test et les données d'entrée.
Pourquoi utiliser un Selenium Cadre d'automatisation ?
Un bien conçu Selenium Ce framework résout trois problèmes récurrents en automatisation des tests : la duplication de code, la fragilité des localisateurs et la difficulté à gérer les données de test. En imposant une structure claire, les équipes peuvent faire évoluer leurs suites de tests, de quelques scripts à plusieurs centaines, sans perdre le contrôle.
- Maintenabilité: Les localisateurs centralisés et les méthodes d'assistance permettent de mettre à jour automatiquement tous les tests utilisant cet élément.
- Réutilisabilité: Les opérations courantes telles que la connexion, la navigation ou la saisie de formulaires sont écrites une seule fois et invoquées dans de nombreux cas de test.
- Évolutivité: L'ajout de nouveaux cas de test devient une mise à jour des données plutôt qu'une tâche de codage, ce qui permet aux non-développeurs de contribuer aux scénarios.
- Signalement et collaboration : Sa structure standardisée facilite l'intégration avec les outils de reporting, les pipelines CI/CD et le contrôle de version.
Types d' Selenium FrameworkTA
Il existe trois principaux types de cadres construite sur Selenium WebDriver permet d'automatiser les cas de test manuels. Chaque style vise un équilibre différent entre l'effort du développeur, l'implication du testeur et la flexibilité des données.
- Cadre basé sur les données
- Cadre axé sur les mots clés
- Cadre hybride
Les sections suivantes expliquent chaque cadre en détail, en commençant par l'approche la plus simple, axée sur les données, et en progressant jusqu'au modèle hybride le plus flexible.
Cadre basé sur les données dans Selenium
Cadre basé sur les données dans Selenium est une méthode permettant de séparer les ensembles de données de test de la logique des cas de test. Une fois les données découplées, vous pouvez modifier les entrées d'une fonctionnalité particulière sans toucher au code de test. Cette méthode est couramment utilisée pour récupérer des cas de test et des suites de tests à partir de sources externes telles que… Excel, .csv, .xml ou tables de bases de données.
Pour lire ou écrire des fichiers Excel, Apache fournit la bibliothèque POI, bien connue. Cette bibliothèque peut gérer les deux types de fichiers. XLS et XLSX formatage. Les CSSS L'implémentation lit les fichiers XLS hérités, tandis que le XSSF Cette implémentation prend en charge les fichiers XLSX modernes.
Nous avons déjà abordé les tests pilotés par les données dans notre précédent tutoriel.
Cadre basé sur les mots clés dans Selenium
Cadre basé sur les mots clés dans Selenium Cette méthode accélère l'automatisation en séparant les mots-clés des fonctions et instructions courantes. Toutes les opérations et instructions sont écrites dans un fichier externe, généralement une feuille Excel. Les testeurs peuvent ainsi spécifier les fonctionnalités à valider sans modifier le code source. Java Ce style de code est donc idéal pour les équipes où les analystes métier ou les équipes d'assurance qualité manuelle contribuent aux définitions de tests.
Voici à quoi ressemble le cadre complet :
Comme vous pouvez le constater, il s'agit d'un cadre en 5 étapes. Étudions-le étape par étape en détail.
Étape 1)
- Le script pilote Execute.java appelle ReadGuru99ExcelFile.java.
- LireGuruLe fichier 99ExcelFile.java contient le code POI qui lit les données à partir d'Excel.
Étape 2)
- LireGuru99ExcelFile.java lit les données du fichier TestCase.xlsx.
- Voici à quoi ressemble la feuille :
- En fonction des mots-clés inscrits dans le fichier Excel, le système effectue l'action correspondante sur l'interface utilisateur.
- Par exemple, pour cliquer sur un bouton intitulé « Connexion », la feuille Excel enregistre le mot-clé « Clic ». Afin d'identifier ce bouton parmi plusieurs sur une page, la ligne Excel définit le nom de l'objet comme « loginButton » et son type comme « nom » (voir la ligne mise en évidence dans l'image). Le type d'objet peut également être XPath, CSS, une classe ou toute autre méthode de localisation.
Étape 3) LireGuru99ExcelFile.java renvoie les données analysées au script pilote Execute.java.
Étape 4)
- Pour tous les éléments d'interface utilisateur web, vous gérez un référentiel d'objets qui stocke les localisateurs d'éléments tels que XPath, le nom, le CSS ou le nom de classe.
- Le script Execute.java (le script principal) lit l'intégralité du référentiel d'objets et le stocke dans une variable.
- Une classe auxiliaire ReadObject expose une méthode getObjectRepository qui charge le référentiel lors de l'exécution.
NOTE: Vous vous demandez peut-être pourquoi un dépôt d'objets est nécessaire. La réponse est simple : la maintenabilité. Si un bouton nommé « btnlogin » est utilisé dans 10 cas de test et que le développeur le renomme en « submit », il faudrait modifier 10 fichiers. Avec un dépôt d'objets, la modification du nom de bouton se fait à un seul endroit.
Étape 5)
- Le pilote transmet les données d'Excel et du référentiel d'objets à l'interface utilisateur.Operaclasse de tion.
- UIOperation contient des fonctions qui associent chaque mot-clé, tel que CLICK et SETTEXT, à une action WebDriver concrète.
- UIOperation est une Java classe qui contient l'implémentation réelle permettant d'interagir avec les éléments web.
La structure complète du projet ressemble à ceci :
Prenons un exemple concret :
Scénario de test: Nous exécutons 2 cas de test.
- Cas de test 1 :
- Aller à
https://demo.guru99.com/V4/ - Entrez l'ID utilisateur
- Entrer le mot de passe
- Cliquez sur Réinitialiser
- Cas de test 2 :
- Aller à
https://demo.guru99.com/V4/ - Entrez l'ID utilisateur
- Entrer le mot de passe
- Cliquez sur Login
objet.propriétés
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
LireGuru99ExcelFile.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;
}
}
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 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");
}
}
}
ExécuterTest.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");
}
}
}
}
Après exécution, le résultat ressemble à ceci :
Téléchargez le Selenium Fichiers de projet pour la démo de ce didacticiel
Cadre hybride
Cadre hybride in Selenium Ce modèle combine les atouts des frameworks pilotés par mots-clés et par données. Simple d'utilisation, il permet aux testeurs manuels de créer des cas de test en modifiant simplement les mots-clés, les données de test et le référentiel d'objets, sans écrire une seule ligne de code.
Ici, les fichiers Excel conservent les mots-clés de chaque étape, et TestNG's fournisseur de données fournit les données de test. Cette séparation permet de faire varier indépendamment le vocabulaire d'actions et les variations d'entrée.
Pour notre framework hybride, rien ne change dans la structure pilotée par mots-clés : nous remplaçons simplement ExecuteTest.java par HybridExecuteTest.java.
Ce fichier HybridExecuteTest contient la logique complète pilotée par mots-clés combinée à TestNGmécanisme de fournisseur de données de .
La représentation graphique complète du cadre hybride ressemble à ceci :
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;
}
}
Téléchargez le Selenium Fichiers de projet pour la démo de ce didacticiel












