TestNG Слушателите в Selenium
⚡ Умно обобщение
Слушателите в Selenium Уебдрайверът е TestNG интерфейси, които прехващат тестови събития, за да персонализират лог файлове, отчети и действия след неуспех. Тази статия обяснява методите на ITestListener, превежда през изпълним Java пример и пояснява как Selenium 4 замени остарелия WebDriverEventListener.

Selenium Скриптовете на WebDriver често трябва да реагират на тестови събития, като например успешно извършено твърдение, неуспешен локатор или пропусната стъпка. Слушателите правят това възможно. Най-общо казано, Selenium проектите разчитат на две семейства слушатели:
- Слушатели на WebDriver
- TestNG Слушатели
В този урок ще се съсредоточим върху TestNG Слушатели, с бележка за това как са се променили слушателите на ниво WebDriver в Selenium 4.x.
Какво е слушател в TestNG?
Слушателят е интерфейс, който променя поведението по подразбиране на TestNGКакто подсказва името, слушателите „слушат“ събития, дефинирани в Selenium скрипт и реагират съответно. Използвате ги, като имплементирате съответния интерфейс на Listener и го регистрирате във вашия тестов клас или пакет. Listener-ите ви позволяват да персонализирате TestNG отчети, прикачване на екранни снимки и генериране на структурирани лог файлове.
Видове слушатели в TestNG
TestNG предоставя семейство от интерфейси за слушатели, като всеки от тях е насочен към различен етап от жизнения цикъл на теста.
По-долу са посочени често използваните TestNG слушатели:
- IAnnotationTransformer
- IAnotationTransformer2
- IConfigurable
- IConfigurationListener
- IExecutionListener
- Ihookable
- IInvokedMethodListener
- IIInvokedMethodListener2
- ImethodInterceptor
- IReporter
- ISuiteListener
- ITestListener
Тези интерфейси се използват в Selenium за генериране на лог файлове или персонализиране TestNG отчети. В този урок ще имплементираме ITestListener.
ITestListener разкрива следните методи:
- при стартиране – извиква се при стартиране на който и да е тест.
- приУспех наТест – извиква се, когато тестът е преминал успешно.
- при неуспешен тест – извиква се, когато тестът е неуспешен.
- при пропускане на теста – извиква се, когато тестът бъде пропуснат.
- onTestFailedButWithinSuccessPercentage – извиква се, когато тестът е неуспешен, но е в рамките на процента на успех.
- при Край – извиква се след изпълнението на всички тестове в класа.
Сценарий на теста
В този тестов сценарий ще автоматизираме процеса на влизане и ще го имплементираме ITestListener против него.
- Стартиране Firefox и отворете сайта https://demo.guru99.com/V4/
- Влезте в приложението.
Стъпки за създаване на a TestNG слушател
За тестовия сценарий по-горе, ще имплементираме Listener стъпка по стъпка.
Стъпка 1) Създайте клас, наречен ListenerTest който прилага ITestListenerЗадръжте курсора на мишката върху червената подчертаваща линия и Eclipse ще предложи две бързи решения, както е показано по-долу:
Кликнете върху „Добавяне на нереализиран метод“. Към кода ви се добавят множество методи тип „stub“ (без тяло), подобно на това:
внос org.testng.ITestContext;
внос org.testng.ITestListener;
внос org.testng.ITestResult;
обществена класа ListenerTest сечива ITestListener {
@Отмени
публична празнота приЗавършване(ITestContext арг0) {
// TODO Автоматично генериран метод-заготовка
}
@Отмени
публична празнота приСтарт(ITestContext арг0) {
// TODO Автоматично генериран метод-заготовка
}
@Отмени
публична празнота приТестНеуспешенБутВПроцентУспех(ITestResult арг0) {
// TODO Автоматично генериран метод-заготовка
}
@Отмени
публична празнота приНеуспешенТест(ITestResult арг0) {
// TODO Автоматично генериран метод-заготовка
}
@Отмени
публична празнота приПропускане наТест(ITestResult арг0) {
// TODO Автоматично генериран метод-заготовка
}
@Отмени
публична празнота приСтартиранеНаТест(ITestResult арг0) {
// TODO Автоматично генериран метод-заготовка
}
@Отмени
публична празнота приУспехПриТест(ITestResult арг0) {
// TODO Автоматично генериран метод-заготовка
}
}
Сега нека модифицираме ListenerTest клас. По-специално, ще попълним следните методи: при неуспех на теста, при пропускане на теста, приСтартиране на теста, и приУспешенТест.
Промяната е проста: всеки метод отпечатва името на теста, така че конзолата ясно да показва състоянието „минал“, „неминал“ и „пропуснал“.
След модификацията, кодът изглежда така:
внос org.testng.ITestContext;
внос org.testng.ITestListener;
внос org.testng.ITestResult;
обществена класа ListenerTest сечива ITestListener {
@Отмени
публична празнота приЗавършване(ITestContext Резултат) {
}
@Отмени
публична празнота приСтарт(ITestContext Резултат) {
}
@Отмени
публична празнота приТестНеуспешенБутВПроцентУспех(ITestResult Резултат) {
}
// Когато тестовият случай е неуспешен, се извиква този метод.
@Отмени
публична празнота приНеуспешенТест(ITestResult Резултат) {
System.out.println(„Името на неуспешния тестов случай е:“ + Резултат.getName());
}
// Когато даден тестов случай бъде пропуснат, се извиква този метод.
@Отмени
публична празнота приПропускане наТест(ITestResult Резултат) {
System.out.println(„Името на пропуснатия тестов случай е:“ + Резултат.getName());
}
// Когато стартира тестов случай, този метод се извиква.
@Отмени
публична празнота приСтартиранеНаТест(ITestResult Резултат) {
System.out.println(Резултат.getName() + „Тестовият случай е стартиран“);
}
// Когато тестовият случай е преминал успешно, се извиква този метод.
@Отмени
публична празнота приУспехПриТест(ITestResult Резултат) {
System.out.println(„Името на преминатия тестов случай е:“ + Резултат.getName());
}
}
Стъпка 2) Създайте друг клас, наречен Тестови случаи за автоматизация на влизането. Selenium ще изпълни този клас, за да влезе в демо сайта.
внос org.openqa.selenium.By;
внос org.openqa.selenium.WebDriver;
внос org.openqa.selenium.firefox.FirefoxШофьори;
внос org.testng.Assert;
внос org.testng.annotations.Слушатели;
внос org.testng.annotations.Тест;
обществена класа Тестови случаи {
уебдрайвер шофьор = на нови Firefoxдрайвер();
// Тест, предназначен да премине успешно, за да се провери успехът на слушателя.
@Тест
публична празнота Вход() {
драйвер.get(„https://demo.guru99.com/V4/“);
driver.findElement(By.name(„ефективно потребителско име“)).sendKeys(„mngr34926“);
driver.findElement(By.name("Парола")).sendKeys(„amUpenu“);
driver.findElement(By.name(„btnLogin“)).щракване();
}
// Принудително неуспешен тест, за да се провери слушателят на неуспеха.
@Тест
публична празнота ТестЗаНеуспех() {
System.out.println(„Този метод за тестване се проваля“);
Assert.assertTrue(фалшив);
}
}
Стъпка 3) След това прикачете този слушател към нашия тестов клас Тестови случаиИма два начина за свързване на клас към интерфейс за слушане.
Първият начин е да използвате @Слушателите анотация, както е показано по-долу:
Добавяме тази анотация над Тестови случаи клас. След това класът изглежда така:
внос org.openqa.selenium.By;
внос org.openqa.selenium.WebDriver;
внос org.openqa.selenium.firefox.FirefoxШофьори;
внос org.testng.Assert;
внос org.testng.annotations.Слушатели;
внос org.testng.annotations.Тест;
@Listeners(Listener_Demo.ListenerTest.class)
обществена класа Тестови случаи {
уебдрайвер шофьор = на нови Firefoxдрайвер();
// Тест за преминаване, за да се провери успехът на слушателя.
@Тест
публична празнота Вход() {
драйвер.get(„https://demo.guru99.com/V4/“);
driver.findElement(By.name(„ефективно потребителско име“)).sendKeys(„mngr34926“);
driver.findElement(By.name("Парола")).sendKeys(„amUpenu“);
driver.findElement(By.name(„btnLogin“)).щракване();
}
// Принудително неуспешен тест, за да се провери слушателят на неуспеха.
@Тест
публична празнота ТестЗаНеуспех() {
System.out.println(„Този метод за тестване се проваля“);
Assert.assertTrue(фалшив);
}
}
Структурата на проекта изглежда така:
Стъпка 4) Изпълнете Тестови случаи клас. Методи вътре ListenerTest се извикват автоматично въз основа на поведението на методите, анотирани с @Тест.
Стъпка 5) Проверете показания в конзолата резултат.
Изходът от Тестови случаи изглежда като:
C:\Потребители\gauravn\AppData\Local\Temp\testng-eclipse–1058076918\testng-customsuite.xml
Тестът за вход е стартиран
Името на преминатия тестов случай е: Вход
Тестовият случай TestToFail е стартиран
Този метод за тестване е неуспешен
Името на неуспешния тестов случай е: TestToFail
ПРЕМИНАЛО: Вход
НЕУСПЕШНО: TestToFail
java.lang.AssertionError: очаквано [true], но намерено [false]
Използване на слушател за множество класове
Ако даден проект има много тестови класове, добавянето на @Слушателите Анотацията към всяка от тях става тромава и податлива на грешки.
В такъв случай, създайте testng.xml файл и регистрирайте слушателя там веднъж.
Този слушател се прилага в целия тестов набор, независимо от броя на класовете. Когато стартирате XML файла, слушателят се задейства за всеки клас, деклариран в набора, и можете да свържете произволен брой класове слушатели в рамките на един и същ таг.
WebDriverListener в Selenium 4 срещу остарелия EventFiringWebDriver
Докато TestNG Слушателите реагират на събития от жизнения цикъл на теста, докато слушателите на WebDriver реагират на действия на драйвера на браузъра, като например щракване, навигация или извикване на findElement. В Selenium 3 типичният подход беше Слушател на събития на уеб драйвер интерфейс, окабелен през EventFiringWebDriverИ двете са остарели в Selenium 4.x.
Съвременният заместител е WebDriverListener интерфейс, комбиниран с СъбитиеИзстрелванеДекоратор:
внос org.openqa.selenium.chrome.ChromeDriver;
внос org.openqa.selenium.support.events.EventFiringDecorator;
внос org.openqa.selenium.support.events.WebDriverListener;
обществена класа Слушател на регистриране сечива WebDriverListener {
@Отмени
публична празнота предиПолучаване(уебдрайвер драйвер, URL адрес на низ) {
System.out.println(„Навигиране до“ + URL адрес);
}
}
уебдрайвер суров = на нови ChromeDriver();
уебдрайвер шофьор = на нови СъбитиеИзстрелванеДекоратор<>(на нови LoggingListener()).decorate(raw);
Декораторът може да обгръща всеки WebDriver, WebElement или Alert, което е по-гъвкаво от старата обвивка за задействане на събития. Използвайте WebDriverListener за наблюдаемост от страна на браузъра и TestNG ITestListener за отчитане на ниво пакет.
Слушатели, задвижвани от изкуствен интелект: По-интелигентни логове и сортиране на грешки
Модерен дизайн Selenium Екипите все по-често включват AI услуги в своите слушатели, за да направят CI сигналите по-действителни. Вътре при неуспех на теста, слушател, подпомаган от изкуствен интелект, може да заснеме моментна снимка на DOM плюс екранна снимка, да ги изпрати до модел, който връща вероятен клъстер с първопричина, и да запише етикет обратно в TestNG отчет или инструмент като ReportPortal.
Често срещани модели, задвижвани от изкуствен интелект, включват:
- Откриване чрез нестабилен тест: Слушателите препращат времевите линии за преминаване/неуспех към модел, който класифицира даден неуспех като нестабилен, екологичен или реална регресия.
- Интелигентни скрийншотове: Моделите за компютърно зрение изрязват, анотират и правят разлики в екранните снимки на потребителския интерфейс, така че рецензентите да виждат променения регион, вместо цял дъмп на страницата.
- Самовъзстановяващи се локатори: A WebDriverListener куки предиНамиранеНаЕлемент и моли помощник с изкуствен интелект да предложи алтернативен локатор, когато основният хвърля NoSuchElementException.
- Резюмета на естествен език: An IReporter Имплементацията подава резултатите от пакета в LLM, който генерира резюме от един параграф.
Слоят слушател е най-чистото място за инжектиране на тези куки, защото остава извън тестовата логика и се прилага равномерно в целия пакет.
Oбобщение
От слушателите се изисква да генерират регистрационни файлове или да персонализират TestNG докладите в Selenium WebDriver.
- TestNG предлага много интерфейси за слушане; изберете този, който съответства на събитието, което ви интересува.
- Слушателите са интерфейси, използвани в Selenium Скриптове на WebDriver за реагиране на събития от жизнения цикъл на теста.
- Урокът демонстрира ITestListener с минал и неминал тест.
- Можете да прикачите слушател с @Слушателите или го регистрирайте веднъж в testng.xml за целия апартамент.
- Selenium 4.x замества EventFiringWebDriver с WebDriverListener + СъбитиеИзстрелванеДекоратор за събития на ниво WebDriver.






