TestNG Luisteraars binnen Selenium
โก Slimme samenvatting
Luisteraars binnen Selenium WebDriver zijn TestNG Interfaces die testgebeurtenissen onderscheppen om logboeken, rapporten en acties na een fout aan te passen. Dit artikel legt de methoden van ITestListener uit en doorloopt een uitvoerbaar voorbeeld. Java bijvoorbeeld, en verduidelijkt hoe Selenium 4 verving de verouderde WebDriverEventListener.

Selenium WebDriver-scripts moeten vaak reageren op testgebeurtenissen zoals een geslaagde bewering, een mislukte locator of een overgeslagen stap. Listeners maken dat mogelijk. In grote lijnen, Selenium De projecten zijn afhankelijk van twee soorten luisteraars:
- WebDriver-luisteraars
- TestNG luisteraars
In deze tutorial zullen we ons concentreren op TestNG Luisteraars, met een toelichting op hoe luisteraars op WebDriver-niveau zijn gewijzigd in Selenium 4.x.
Wat is een luisteraar in TestNG?
Een Listener is een interface die het standaardgedrag van een Listener wijzigt. TestNGZoals de naam al doet vermoeden, luisteren Listeners naar gebeurtenissen die zijn gedefinieerd in een Selenium Je gebruikt ze door de relevante Listener-interface te implementeren en deze te registreren in je testklasse of -suite. Listeners stellen je in staat om aan te passen. TestNG Rapporten indienen, schermafbeeldingen bijvoegen en gestructureerde logboeken genereren.
Soorten luisteraars in TestNG
TestNG Het pakket bevat een reeks luisterinterfaces, die elk gericht zijn op een andere fase van de testlevenscyclus.
Hieronder staan โโde meest gebruikte TestNG luisteraars:
- IAnnotatieTransformer
- IAnnotatieTransformer2
- IConfigureerbaar
- IConfiguratieListener
- IExecutionListener
- IAanhaakbaar
- IInvokedMethodListener
- IInvokedMethodListener2
- IMethodeInterceptor
- IRporter
- ISuiteLuisteraar
- ITestListener
Deze interfaces worden gebruikt in Selenium om logboeken te genereren of aan te passen TestNG rapporten. In deze handleiding implementeren we... ITestListener.
ITestListener stelt de volgende methoden beschikbaar:
- bij Start โ Wordt aangeroepen wanneer een test start.
- onTestSuccess โ Wordt aangeroepen wanneer een test slaagt.
- onTestFailure โ Wordt aangeroepen wanneer een test mislukt.
- onTestSkipped โ Deze functie wordt aangeroepen wanneer een test wordt overgeslagen.
- onTestFailedButWithinSuccessPercentage โ Deze functie wordt aangeroepen wanneer een test mislukt, maar binnen het slagingspercentage valt.
- onFinish โ Deze functie wordt aangeroepen nadat alle tests in de klasse zijn uitgevoerd.
Testscenario
In dit testscenario automatiseren we het inlogproces en implementeren we... ITestListener tegen het.
- Lancering Firefox en open de site https://demo.guru99.com/V4/
- Log in op de applicatie.
Stappen voor het maken van een TestNG Luisteraar
Voor het bovenstaande testscenario implementeren we de Listener stap voor stap.
Stap 1) Maak een klasse aan met de naam Luistertest dat implementeert ITestListenerBeweeg de muis over de rode onderstreping en Eclipse Hieronder volgen twee snelle oplossingen:
Klik op "Niet-geรฏmplementeerde methoden toevoegen". Er worden meerdere placeholder-methoden (zonder body) aan uw code toegevoegd, vergelijkbaar met dit:
importeren org.testng.ITestContext;
importeren org.testng.ITestListener;
importeren org.testng.ITestResult;
openbare klasse Luistertest gereedschap ITestListener {
@ Override
openbare leegte onFinish(ITestContext arg0) {
// TODO Automatisch gegenereerde methode-stub
}
@ Override
openbare leegte onStart(ITestContext arg0) {
// TODO Automatisch gegenereerde methode-stub
}
@ Override
openbare leegte onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}
@ Override
openbare leegte onTestFailure(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}
@ Override
openbare leegte onTestSkipped(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}
@ Override
openbare leegte onTestStart(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}
@ Override
openbare leegte onTestSuccess(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}
}
Laten we nu de Luistertest klasse. We zullen met name de volgende methoden invullen: onTestFailure, onTestSkipped, onTestStarten onTestSuccess.
De wijziging is simpel: elke methode print de naam van de test, zodat de console duidelijk de status 'geslaagd', 'mislukt' en 'overgeslagen' weergeeft.
Na de aanpassing ziet de code er als volgt uit:
importeren org.testng.ITestContext;
importeren org.testng.ITestListener;
importeren org.testng.ITestResult;
openbare klasse Luistertest gereedschap ITestListener {
@ Override
openbare leegte onFinish(ITestContext Resultaat) {
}
@ Override
openbare leegte onStart(ITestContext Resultaat) {
}
@ Override
openbare leegte onTestFailedButWithinSuccessPercentage(ITestResult Resultaat) {
}
// Wanneer een testcase mislukt, wordt deze methode aangeroepen.
@ Override
openbare leegte onTestFailure(ITestResult Resultaat) {
Systeem.uit.println(De naam van de testcase die is mislukt is: + Result.getName());
}
// Deze methode wordt aangeroepen wanneer een testcase wordt overgeslagen.
@ Override
openbare leegte onTestSkipped(ITestResult Resultaat) {
Systeem.uit.println(De naam van de overgeslagen testcase is: + Result.getName());
}
// Deze methode wordt aangeroepen wanneer een testcase start.
@ Override
openbare leegte onTestStart(ITestResult Resultaat) {
System.out.println(Result.getName() + "Testcase gestart");
}
// Deze methode wordt aangeroepen wanneer een testcase slaagt.
@ Override
openbare leegte onTestSuccess(ITestResult Resultaat) {
Systeem.uit.println(De naam van de geslaagde testcase is: + Result.getName());
}
}
Stap 2) Maak een andere klasse aan met de naam Testgevallen voor de automatische aanmelding. Selenium Deze klasse wordt uitgevoerd om in te loggen op de demosite.
importeren org.openqa.selenium.Door;
importeren org.openqa.selenium.WebDriver;
importeren org.openqa.selenium.firefox.FirefoxChauffeurs;
importeren org.testng.Assert;
importeren org.testng.annotations.Listeners;
importeren org.testng.annotaties.Test;
openbare klasse Testgevallen {
webdriver bestuurder = nieuwe Firefoxbestuurder();
// Test ontworpen om te slagen, om de succeslistener te verifiรซren.
@Toets
openbare leegte Inloggen() {
driver.get(โhttps://demo.guru99.com/V4/โ);
driver.findElement(By.name(โuidโ)).sendKeys(โmngr34926โ);
driver.findElement(By.name("wachtwoord")).sendKeys(โamUpenuโ);
driver.findElement(By.name(โbtnLoginโ)).klik();
}
// Test geforceerd mislukt, om de foutlistener te controleren.
@Toets
openbare leegte TestToFail() {
Systeem.uit.println(โDeze testmethode is misluktโ);
Assert.assertTrue(vals);
}
}
Stap 3) Koppel deze listener vervolgens aan onze testklasse. TestgevallenEr zijn twee manieren om een โโklasse aan een luisterinterface te koppelen.
De eerste manier is om gebruik te maken van de @Luisteraars annotatie, zoals hieronder weergegeven:
We voegen deze annotatie boven de toe Testgevallen klasse. De klasse ziet er dan als volgt uit:
importeren org.openqa.selenium.Door;
importeren org.openqa.selenium.WebDriver;
importeren org.openqa.selenium.firefox.FirefoxChauffeurs;
importeren org.testng.Assert;
importeren org.testng.annotations.Listeners;
importeren org.testng.annotaties.Test;
@Listeners(Listener_Demo.ListenerTest.class)
openbare klasse Testgevallen {
webdriver bestuurder = nieuwe Firefoxbestuurder();
// Test om te controleren of de succeslistener slaagt.
@Toets
openbare leegte Inloggen() {
driver.get(โhttps://demo.guru99.com/V4/โ);
driver.findElement(By.name(โuidโ)).sendKeys(โmngr34926โ);
driver.findElement(By.name("wachtwoord")).sendKeys(โamUpenuโ);
driver.findElement(By.name(โbtnLoginโ)).klik();
}
// Test geforceerd mislukt, om de foutlistener te controleren.
@Toets
openbare leegte TestToFail() {
Systeem.uit.println(โDeze testmethode is misluktโ);
Assert.assertTrue(vals);
}
}
De projectstructuur ziet er als volgt uit:
Stap 4) Voer de Testgevallen klasse. Methoden binnenin Luistertest worden automatisch aangeroepen op basis van het gedrag van methoden die zijn geannoteerd met @Toets.
Stap 5) Controleer de uitvoer die in de console wordt weergegeven.
De uitvoer van Testgevallen lijkt op:
C:\Users\gauravn\AppData\Local\Temp\testng-eclipseโ1058076918\testng-customsuite.xml
Aanmeldingstest gestart
De naam van de geslaagde testcase is: Inloggen
Testcase TestToFail gestart
Deze testmethode faalt
De naam van de testcase die is mislukt is: TestToFail
GESLAAGD: Inloggen
MISLUKT: TestToFail
java.lang.AssertionError: verwacht [true] maar gevonden [false]
Een listener gebruiken voor meerdere klassen
Als een project veel testklassen heeft, is het toevoegen van de @Luisteraars Het annoteren van elk afzonderlijk item wordt omslachtig en foutgevoelig.
Maak in dat geval een testenng.xml Het bestand moet daar eenmaal worden aangemaakt en de listener moet daar worden geregistreerd.
Deze listener wordt vervolgens toegepast op de gehele testsuite, ongeacht het aantal klassen. Wanneer je het XML-bestand uitvoert, wordt de listener geactiveerd voor elke klasse die in de suite is gedeclareerd, en je kunt een willekeurig aantal listenerklassen binnen dezelfde tag aan elkaar koppelen.
WebDriverListener in Selenium 4 versus de verouderde EventFiringWebDriver
Terwijl TestNG Luisteraars reageren op gebeurtenissen in de testlevenscyclus, WebDriver-luisteraars reageren op acties van de browserdriver, zoals een klik, een navigatie of een findElement-aanroep. Selenium 3. De gebruikelijke aanpak was de WebDriverEventListener interface bedraad via EventFiringWebDriverBeide zijn verouderd in Selenium 4.x.
De moderne vervanging is de WebDriverListener interface gecombineerd met EventFiringDecorator:
importeren org.openqa.selenium.chrome.ChromeDriver;
importeren org.openqa.selenium.support.events.EventFiringDecorator;
importeren org.openqa.selenium.support.events.WebDriverListener;
openbare klasse LoggingListener gereedschap WebDriverListener {
@ Override
openbare leegte voorGet(webdriver driver, String url) {
Systeem.uit.println(โNavigeren naarโ + url);
}
}
webdriver ruw = nieuwe ChromeDriver();
webdriver bestuurder = nieuwe EventFiringDecorator<>(nieuwe LoggingListener()).decorate(raw);
De decorator kan elke WebDriver, WebElement of Alert omwikkelen, wat flexibeler is dan de oude event-firing wrapper. Gebruik WebDriverListener voor observeerbaarheid aan de browserzijde en TestNG ITestListener voor rapportage op suite-niveau.
AI-gestuurde luisteraars: slimmere logboekregistratie en foutanalyse.
MODERN Selenium Teams integreren steeds vaker AI-diensten in hun luistersystemen om CI-signalen beter bruikbaar te maken. onTestFailureEen AI-ondersteunde listener kan een DOM-snapshot en een screenshot vastleggen, deze naar een model sturen dat een waarschijnlijke oorzaakcluster retourneert, en een tag terugschrijven in de DOM. TestNG een rapport of een tool zoals ReportPortal.
Veelvoorkomende AI-gestuurde patronen zijn onder andere:
- Detectie van onbetrouwbare tests: Luisteraars sturen tijdlijnen voor geslaagde/mislukte tests door naar een model dat een storing classificeert als onbetrouwbaar, omgevingsgerelateerd of een echte regressie.
- Slimme schermafbeeldingen: Computervisiemodellen snijden UI-screenshots bij, annoteren ze en vergelijken ze, zodat beoordelaars het gewijzigde gedeelte zien in plaats van een volledige paginadump.
- Zelfherstellende locators: A WebDriverListener haken beforeFindElement en vraagt โโeen AI-helper om een โโalternatieve locator voor te stellen wanneer de primaire locator een foutmelding geeft. Geen DergelijkElementUitzondering.
- Samenvattingen in natuurlijke taal: An IRporter De implementatie voert de resultaten van de suite in een LLM in, die een korte samenvatting van รฉรฉn alinea produceert.
De listenerlaag is de meest geschikte plek om deze hooks te injecteren, omdat deze buiten de testlogica blijft en uniform wordt toegepast op de hele testsuite.
Samenvatting
Luisteraars moeten logboeken genereren of aanpassen TestNG rapporten in Selenium Webstuurprogramma.
- TestNG biedt diverse luisterinterfaces; kies de interface die het beste aansluit bij de gebeurtenis waarin u geรฏnteresseerd bent.
- Luisteraars zijn interfaces die worden gebruikt in Selenium WebDriver-scripts om te reageren op gebeurtenissen in de testlevenscyclus.
- De handleiding demonstreerde ITestListener met een geslaagde en een gezakte toets.
- Je kunt een listener koppelen aan @Luisteraars of registreer het eenmalig testenng.xml voor de hele suite.
- Selenium 4.x vervangt EventFiringWebDriver with WebDriverListener + EventFiringDecorator voor gebeurtenissen op WebDriver-niveau.






