Een gegevensgestuurd, trefwoordgestuurd en hybride seleniumraamwerk bouwen



Deze blog legt uit wat een Selenium-framework is, wat de voordelen ervan zijn en hoe Data Driven, Keyword Driven & Hybrid frameworks in selenium geïmplementeerd kunnen worden.

De vorige in deze serie hebben u kennis gemaakt met basisconcepten bij het testen van selenium.In deze blog zal ik je echter vertellen hoe je een Selenium-framework gebruikt om je codestructuur te optimaliseren en dit zal je dichterbij brengen om een .

Wat is een selenium-framework?

Selenium-framework is een codestructuur om het onderhoud van code eenvoudiger en de leesbaarheid van code te verbeteren. Een framework houdt in dat de volledige code wordt opgesplitst in kleinere stukjes code, die een bepaalde functionaliteit testen.





hashmap-implementatie in Java-code

De code is zo opgebouwd dat de 'dataset' gescheiden is van de eigenlijke 'testcase' die de functionaliteit van de webapplicatie zal testen. Het kan ook zo worden gestructureerd dat de testgevallen die moeten worden uitgevoerd, worden aangeroepen (aangeroepen) vanuit een externe applicatie (zoals een .csv).

Er zijn een aantal frameworks beschikbaar, maar 3 veelgebruikte Selenium-framework (s) zijn:



Deze frameworks worden in deze blog met een demo besproken. Maar voordat ik verder ga, wil ik u vertellen waarom er een Selenium-raamwerk moet zijn en welke voordelen u zult hebben als u ze gebruikt.

Waarom hebben we een seleniumraamwerk nodig?

Zonder raamwerk zal er één testcase zijn die de volledige testfunctionaliteit omvat. Het enge is dat deze enkele testcase de mogelijkheid heeft om tot een miljoen regels code op te lopen. Het is dus vrij duidelijk dat een testcase die zo groot is, moeilijk te lezen is. Zelfs als u een functionaliteit later wilt wijzigen, zal het moeilijk zijn om de code aan te passen.

Aangezien de implementatie van een framework zal resulteren in kleinere maar meerdere codestukken, zijn er verschillende voordelen.



Voordelen van Selenium-framework

  • Verhoogd hergebruik van code
  • Verbeterde leesbaarheid van code
  • Betere draagbaarheid
  • Gereduceerd scriptonderhoud

Nu u de basisprincipes van frameworks kent, wil ik ze allemaal in detail uitleggen.

Data Driven Framework

Een Data Driven framework in Selenium is de techniek om de 'dataset' te scheiden van de daadwerkelijke 'testcase' (code). Dit raamwerk is volledig afhankelijk van de input testdata. De testgegevens worden ingevoerd vanuit externe bronnen, zoals een Excel-bestand, .CSV-bestand of een database.

datagedreven raamwerk - selenium raamwerk - edureka

Omdat de testcase is gescheiden van de dataset, kunnen we eenvoudig de testcase van een bepaalde functionaliteit wijzigen zonder grote wijzigingen in uw code aan te brengen. Als u bijvoorbeeld de code voor de aanmeldingsfunctionaliteit wilt wijzigen, kunt u alleen dat wijzigen in plaats van dat u ook elk ander afhankelijk gedeelte in dezelfde code moet wijzigen.

Daarnaast kun je ook eenvoudig bepalen hoeveel data er getest moet worden. U kunt het aantal testparameters eenvoudig vergroten door meer gebruikersnaam- en wachtwoordvelden toe te voegen aan het Excel-bestand (of andere bronnen).

Als ik bijvoorbeeld de login op een webpagina moet controleren, kan ik de set gebruikersnaam- en wachtwoordreferenties in een Excel-bestand bewaren en de inloggegevens doorgeven aan de code om automatisering op de browser uit te voeren in een apart Java-klassebestand.

Apache POI gebruiken met Selenium WebDriver

WebDriver ondersteunt niet rechtstreeks het lezen van Excel-bestanden. Daarom gebruiken we Apache POI voor lezen / schrijven naar elk Microsoft Office-document. U kunt Apache POI (set JAR-bestanden) downloaden van hier . Download het zip- of tar-bestand volgens uw vereisten en plaats ze samen met de set Selenium JAR's.

De coördinatie tussen de hoofdcode en de dataset wordt verzorgd door TestNG-gegevensproviders, dat is een bibliotheek die wordt geleverd als onderdeel van de Apache POI JAR-bestanden. Als demo heb ik een Excel-bestand gemaakt met de naam 'LoginCredentials' waarin de gebruikersnamen en wachtwoorden in verschillende kolommen zijn opgeslagen.

Bekijk de onderstaande code om de testcase te begrijpen. Het is een eenvoudige code om de inlogfunctionaliteit van een applicatie voor het boeken van vluchten te testen.

pakket DataDriven import org.openqa.selenium.By import org.openqa.selenium.chrome.ChromeDriver import org.testng.Assert import org.testng.annotations.AfterMethod import org.testng.annotations.DataProvider import org.testng.annotations.Test public class DDTExcel {ChromeDriver driver @Test (dataProvider = 'testdata') public void DemoProject (String gebruikersnaam, String wachtwoord) gooit InterruptedException {System.setProperty ('webdriver.chrome.driver', 'C: UsersVardhanDownloadschromedriver.exe') driver = nieuwe ChromeDriver () driver.get ('http://newtours.demoaut.com/') driver.findElement (By.name ('userName')). sendKeys (gebruikersnaam) driver.findElement (By.name ('password') )). sendKeys (wachtwoord) driver.findElement (By.name ('login')). ​​click () Thread.sleep (5000) Assert.assertTrue (driver.getTitle (). matches ('Find a Flight: Mercury Tours: '),' Ongeldige inloggegevens ') System.out.println (' Login succesvol ')} @AfterMethod void ProgramTermination () {driver.quit ()} @DataProvider (name =' testdata ') openbaar object [] [] TestDa taFeed () {ReadExcelFile config = new ReadExcelFile ('C: UsersVardhanworkspaceSeleniumLoginCredentials.xlsx') int rijen = config.getRowCount (0) Object [] [] referenties = nieuw object [rijen] [2] voor (int i = 0i

Als je het van hierboven hebt opgemerkt, hebben we een methode met de naam 'TestDataFeed ()'. Bij deze methode heb ik een objectinstantie gemaakt van een andere klasse met de naam 'ReadExcelFile'. Tijdens het instantiëren van dit object heb ik het pad ingevoerd van mijn Excel-bestand met de gegevens. Ik heb verder een for-lus gedefinieerd om de tekst uit de Excel-werkmap op te halen.

Maar voor het lezen van de gegevens van een bepaald bladnummer, kolomnummer en rijnummer, worden de oproepen gedaan naar de klasse 'ReadExcelFile'. De code van mijn 'ReadExcelFile' staat hieronder.

pakket DataDriven import java.io.File import java.io.FileInputStream import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.xssf.usermodel.XSSF Werkboek openbare klasse ReadExcelFile {XSSFWorkbook wb XSSFSheet-blad openbaar ReadExcelFile excelPath) {probeer {File src = nieuw bestand (excelPath) FileInputStream fis = nieuw FileInputStream (src) wb = nieuw XSSFWorkbook (fis)} catch (uitzondering e) {System.out.println (e.getMessage ())}} openbaar String getData (int bladnummer, int rij, int kolom) {sheet = wb.getSheetAt (bladnummer) String data = sheet.getRow (rij) .getCell (kolom) .getStringCellValue () return data} public int getRowCount (int sheetIndex) { int row = wb.getSheetAt (sheetIndex) .getLastRowNum () row = rij + 1 retour rij}}

Noteer eerst de bibliotheken die ik heb geïmporteerd. Ik heb geïmporteerd Apache POI XSSF bibliotheken die worden gebruikt om gegevens te lezen / schrijven naar Excel-bestanden. Hier heb ik een constructor gemaakt (object van dezelfde methode) om de waarden door te geven: bladnummer, rijnummer en kolomnummer. Om dit framework beter te begrijpen, verzoek ik je om onderstaande video door te nemen, waar ik dit op een gestructureerde manier heb uitgelegd.

Gegevensgestuurd raamwerk in Selenium WebDriver | Selenium-zelfstudie

Laten we nu verder gaan met het framework, namelijk het trefwoordgestuurde framework.

Zoekwoordgestuurd framework

Keyword Driven framework is een techniek waarbij alle uit te voeren operaties en instructies apart van de daadwerkelijke testcase worden geschreven. De gelijkenis met het Data Driven-framework is dat de uit te voeren bewerkingen opnieuw worden opgeslagen in een extern bestand zoals een Excel-sheet.

De operaties waar ik het over heb, zijn niets anders dan de methoden die moeten worden uitgevoerd als onderdeel van een testcase. Het voordeel van het trefwoordgestuurde framework is dat u eenvoudig de functionaliteiten kunt beheren die u wilt testen. U kunt de methoden specificeren die de functionaliteit van de applicatie testen in het Excel-bestand. Daarom worden alleen de methodenamen die in Excel zijn gespecificeerd, getest.

Voor het inloggen op de webapplicatie kunnen we bijvoorbeeld meerdere methoden in de hoofdtestcase schrijven, waarbij elke testcase een bepaalde functionaliteit test. Voor het instantiëren van het browserstuurprogramma kan er één methode zijn, voor het vinden van de gebruikersnaam- en wachtwoordvelden, kunnen er methoden zijn, voor het navigeren naar een webpagina kan er een andere methode zijn, enz.

hoe u een nummer omkeert

Bekijk de onderstaande code om te begrijpen hoe het framework eruitziet. De regels die in de onderstaande code zijn becommentarieerd, dienen als uitleg als u het niet begrijpt.

pakket KeywordDriven import org.openqa.selenium.chrome.ChromeDriver import org.testng.Assert import org.testng.annotations.Test import java.util.concurrent.TimeUnit import org.openqa.selenium.By import org.openqa.selenium.WebDriver public class Actions {public static WebDriver driver public static void openBrowser () {System.setProperty ('webdriver.chrome.driver', 'C: UsersVardhanDownloadschromedriver.exe') driver = nieuwe ChromeDriver ()} openbare statische leegte navigatie () {driver .manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS) driver.get ('http://newtours.demoaut.com')} public static void input_Username () {driver.findElement (By.name (' userName ')). sendKeys (' mercury ')} public static void input_Password () {driver.findElement (By.name (' password ')). sendKeys (' mercury ')} public static void click_Login () {driver.findElement (By.name ('login')). ​​Click ()} @Test public static void verify_login () {String pageTitle = driver.getTitle () Assert.assertEquals (pageTitle, 'Find a Flight: Mercury Tours : ')} openbare statische leegte closeBrowser () {driver.quit ()}}

Zoals u kunt zien, zijn de verschillende functionaliteiten die moeten worden getest aanwezig in afzonderlijke methoden die wachten om te worden aangeroepen. Nu zullen deze methoden worden aangeroepen vanuit een andere klasse, gebaseerd op de aanwezigheid van de naam van de methode in het Excel-bestand. En op dezelfde manier heb ik nog een Klasse geschreven om het Excel-bestand te lezen en de resultaten terug te sturen. Beiden worden hieronder weergegeven.

Het klassenbestand dat de methoden aanroept, is dit.

package KeywordDriven public class DriverScript {public static void main (String [] args) throws Exception {// Declaratie van het pad van het Excel-bestand met de naam van het Excel-bestand String sPath = 'C: UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' // Hier we geven het Excel-pad en SheetName door als argumenten om verbinding te maken met het Excel-bestand ReadExcelData.setExcelFile (sPath, 'Sheet1') // Hard gecodeerde waarden worden voorlopig gebruikt voor Excel-rijen en -kolommen // Hard gecodeerde waarden worden gebruikt voor Excel-rij & kolommen voor nu // In latere hoofdstukken zullen we deze hard gecodeerde waarden vervangen door varibales // Dit is de lus voor het lezen van de waarden van kolom 3 (actietrefwoord) rij voor rij voor (int iRow = 1iRow<=7iRow++) { String sActions = ReadExcelData.getCellData(iRow, 1) //Comparing the value of Excel cell with all the keywords in the 'Actions' class if(sActions.equals('openBrowser')) { //This will execute if the excel cell value is 'openBrowser' //Action Keyword is called here to perform action Actions.openBrowser() } else if(sActions.equals('navigate')) { Actions.navigate() } else if(sActions.equals('input_Username')) { Actions.input_Username() } else if(sActions.equals('input_Password')) { Actions.input_Password() } else if(sActions.equals('click_Login')) { Actions.click_Login() } else if(sActions.equals('verify_Login')) { Actions.verify_login() } else if(sActions.equals('closeBrowser')) { Actions.closeBrowser() } } } } 

En het klassenbestand dat de Excel-waarden leest, is dit.

pakket KeywordDriven import java.io.FileInputStream import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.apache.poi.xssf.usermodel.XSSFCell public class ReadExcelData {private static XSSFSheet ExcelWSheet privé statisch XSSFWorkbook ExcelWBook privé statisch XSSFCell Cell // Deze methode is om het bestandspad in te stellen en het Excel-bestand te openen // Geef Excel-pad en SheetName door als argumenten voor deze methode public static void setExcelFile (String Path, String SheetName) gooit Uitzondering {FileInputStream ExcelFile = nieuwe FileInputStream (pad) ExcelWBook = nieuwe XSSFWorkbook (ExcelFile) ExcelWSheet = ExcelWBook.getSheet (SheetName)} // Deze methode is om de testgegevens uit de Excel-cel te lezen // Hierin geven we parameters / argumenten door als Rij Num en Kol Num openbare statische String getCellData (int RowNum, int ColNum) genereert Uitzondering {Cell = ExcelWSheet.getRow (RowNum) .getCell (ColNum) String CellData = Cell.getStringCellValue () return CellData}}

Laten we nu naar het laatste deel van dit Selenium Framework-blog gaan, waar ik je zal laten zien hoe je een hybride framework bouwt.

Hybride raamwerk

Hybride framework is een techniek waarbij we optimaal gebruik kunnen maken van zowel Data Driven als Keyword Driven Selenium framework (s). Met behulp van de voorbeelden die hierboven in deze blog worden getoond, kunnen we een hybride raamwerk bouwen door de uit te voeren methoden op te slaan in een Excel-bestand (trefwoordgestuurde benadering) en deze methodenamen door te geven aan de Java-reflectieklasse (datagedreven aanpak) in plaats van een If / Else loop in de klasse 'DriverScript'.

Bekijk de gewijzigde klasse 'DriverScript' in het onderstaande codefragment.Hier wordt, in plaats van meerdere If / Else-lussen te gebruiken, een gegevensgestuurde benadering gebruikt om de methodenamen uit het Excel-bestand te lezen.

pakket HybridFramework import java.lang.reflect.Method publieke klasse DriverScriptJava {// Dit is een klasseobject, gedeclareerd als 'public static' // Zodat het kan worden gebruikt buiten het bereik van de main [] methode public static Actions actionKeywords public static String sActions // Dit is een reflectieklasse-object, gedeclareerd als 'public static' // Zodat het kan worden gebruikt buiten het bereik van de main [] methode public static Method method [] public static void main (String [] args) throws Uitzondering {// Het pad van het Excel-bestand opgeven met de naam van het Excel-bestand String sPath = 'C: UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' // Hier geven we het Excel-pad en SheetName door om verbinding te maken met het Excel-bestand // Deze methode is eerder gemaakt ReadExcelData.setExcelFile (sPath, 'Sheet1') // Hard gecodeerde waarden worden voorlopig gebruikt voor Excel rij en kolommen // Later zullen we deze hard gecodeerde waarde veel efficiënter gebruiken // Dit is de lus om te lezen de waarden van de kolomrij (trefwoord actie) per rij // Dit betekent dat deze lus alle stappen uitvoert die voor de testcase in het teststappenblad voor (int iRow = 1iRow<=7iRow++) { sActions = ReadExcelData.getCellData(iRow, 1) //A new separate method is created with the name 'execute_Actions' //You will find this method below of the this test //So this statement is doing nothing but calling that piece of code to execute execute_Actions() } } //This method contains the code to perform some action //As it is completely different set of logic, which revolves around the action only, it makes sense to keep it separate from the main driver script //This is to execute test step (Action) private static void execute_Actions() throws Exception { //Here we are instantiating a new object of class 'Actions' actionKeywords = new Actions() //This will load all the methods of the class 'Actions' in it. //It will be like array of method, use the break point here and do the watch method = actionKeywords.getClass().getMethods() //This is a loop which will run for the number of actions in the Action Keyword class //method variable contain all the method and method.length returns the total number of methods for(int i = 0i

Om dit concept van Data Driven, Keyword Driven & Hybrid Driven frameworks beter te begrijpen, verzoek ik u de onderstaande video te bekijken.

Selenium Framework met behulp van Java | Selenium-zelfstudie | Selenium-training online

Ik hoop dat deze blog nuttig voor je was en je een duidelijk begrip heeft gegeven van wat een Selenium-framework is, hoe het nuttig is en hoe je je codestructuur kunt bouwen met behulp van deze 3 Selenium-frameworks. Blijf op de hoogte voor meer blogs in deze serie.

Als je Selenium wilt leren en carrière wilt maken in het testdomein, bekijk dan onze interactieve, live-online hier, dat wordt geleverd met 24 * 7 ondersteuning om u tijdens uw leerperiode te begeleiden. De concepten die verband houden met 'Selenium Framework' komen uitgebreid aan bod in de cursus van Edureka.

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte en we nemen contact met u op.