Как сделать, чтобы при падении теста закрывался браузер и не мешал другим теста выполняться?

Webdriver + Java + TestNG
Собрала пакет из 20 тестов.
По отдельности тесты запускаются замечательно, но при попытке запустить пакет целиком начинаются недоразумения, если так можно выразиться.

Каждый тест содержит функционал залогиневания в начале и разлогиневания в конце, так вот если тест #5 падает, браузер не закрывается и следующий тест #6 вводит логин и пароль в уже залогиненую учетку, в общем, при падении какого-либо теста все остальное тоже падает (

1 лайк

я прописываю Teardown, который выполняется всегда, даже если тест упал
в teardown-e разлогин

В TestNG есть такая аннотация @AfterMethod - надо использовать её. Это аналог jUnit teardown(), о котором упомянула @uslashka

Есть также вариации различных After-аннотаций, почитай, возможно в твоей ситуации лучше другие подойдут

что-то такое

@AfterTest(alwaysRun = true)
public void tearDown(){
if(driver != null){
driver.quit();
}

@AfterTest(alwaysRun = true)
public void tearDown(ITestContext context){
WebDriver driver = getDriver(context);
if(driver != null){
driver.quit();
}

	@AfterSuite(alwaysRun = true)
public void tearDown() {
	if (driver != null) {
		driver.quit();
	}
}

у меня такой tearDown был
разлогин был отдельным методом protected void spologout() {}
добавила разлогин перед driver.quit();

получилось

@AfterTest(alwaysRun = true)
public void tearDown() {
	if (driver != null) {
		logout();
		driver.quit();
		
		}
}			

все равно при падении, нет разлогина и driver.quit(); тоже судя по всему не происходит, так при запуске следующего теста юзер уже залогинен и попытка залогинеться снова

А сам browser закрываеться ? Может не та аннотация . Илт вообще cookies
@AfterMethod бозначают методы, которые исполняются каждый раз после исполнения тестового метода.
@AfterTest обозначают методы, которые исполняются единожды после исполнения теста(тот, который включает в себя тестовые классы, не путать с тестовыми методами).

вы не знаете почему в самом конце выполнения всех тестов из пакета браузер не закрывается?

при последовательном выполнении тестов в пакете браузер закрывается, а в конце самого последнего теста остается открытым?

хотя указана команда закрывать браузер

	@AfterSuite(alwaysRun = true)
        public void tearDown() {
	if (driver != null) {
		driver.quit();
		
		}
}

@AfterSuite- віполняться должно один раз после всех тестов .
У вас получаеться что выполняеться закрытие после каждого теста , кроме последнего ?

Еще момент какая у вас ерархия классов ? В каком классе у ваc данный метод tearDown
Модификаторы классов у вас public ?

Простите, я не так объяснила проблему.

Браузер запускается один раз при запуске пакета, но по окончании прогона он не закрывается.

Если тесты запускаю по одному, то браузер закрывается по окончании выполнения теста.

tearDown у меня в классе TestBase который общий для всех

все классы public

@Diana, как ты запускаешь тесты? По-одному и пачкой: из IDE, из командной строки, через maven? Какой testng-конфиг при этом используется?

по одному запускаю из Eclipse и пачкой запускаю из него же.
на данном этапе просто делаю тесты и учусь за одно
все сделала по семинарам господина @barancev

настроила maven, git, jenkins локально
не запускала еще из командной строки

Debug из IDEA/Eclipse заходит в этот метод ?

Debug у меня работет, но всегда доходит до точки остановки и если делаю дальше выполнение по шагам, то всегда Source not found на вкладке Invoker.class

В смысле в метод заходит , но на нем валиться ? И какой browser .
аннотации @AfterTest @AfterClass не пробовали поставить вместо Suite ?

при дебаггинге в метод заходит, но если встречает точку остановки Toggle Breakpoint то никогда не идет дальше по шагам, даже если ошибки никакой нет

если ставлю @AfterTest то никакой разницы не видно и отличий от @AfterSuite
если ставлю @AfterClass то выполняется только один тест, дальше ошибка The FirefoxDriver cannot be used after quit() was called.

запускаю пачкой через package.xml, потому что некоторые тесты в группе "BUG"

в общем классе TestBase два таких метода, только не спрашивайте почему, это из заготовок с семинара :blush:

	@BeforeClass
public void init() {
	baseUrl = PropertyLoader.loadProperty("site.url");
	gridHubUrl = PropertyLoader.loadProperty("grid2.hub");

	browser = new Browser();
	browser.setName(PropertyLoader.loadProperty("browser.name"));
	browser.setVersion(PropertyLoader.loadProperty("browser.version"));
	browser.setPlatform(PropertyLoader.loadProperty("browser.platform"));

	String username = PropertyLoader.loadProperty("user.username");
	String password = PropertyLoader.loadProperty("user.password");
	
	driver = WebDriverFactory.getInstance(gridHubUrl, browser, username, password);
	driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
	driver.manage().window().maximize();
	
	genData = new GenerateData();
}

и

	@AfterSuite(alwaysRun = true)
public void tearDown() {
	if (driver != null) {
		driver.quit();
		
		}
}

на сколько я помню аннотации не работают для group если сами не в группе .
уберите group

А не логичней тогда организовать структуру логина по другому?

Например логиниться перед методом, и переходить на страницу логина и разлогиниваться каждый раз После тестового метода.

Как вариант, для каждого тестового метода, открывать свой браузер и закрывать после себя

1 лайк

@Diana, прислушайся к совету @alexkuzpro - Before и After аннотации должны быть симметричными. То есть, если Before Method, то и After Method - это позволит открывать новый браузер перед запуском теста (метода тестового класса) и закрывать браузер после его выполнения. У меня например сейчас так сделано, нормально работает.
Если надо, чтобы браузер открывался один раз на весь класс тестов и закрывался после его завершения, то и использовать тогда BeforeClass и AfterClass и т.д. Зависит от того как у тебя организованы тесты

Читай документацию, разбирайся, экспериментируй.

1 лайк

Не обязательно аннотации должны быть симметричными. В данном случае перед каждым классом драйвер инициализируется путём обращения к фабрике, но после завершения класса он не останавливается, и следующий класс имеет возможность его повторно использовать. А при завершении сьюта драйвер останавливается (хотя правильнее было бы сделать WebDriverFactory.dismissAll(), если это используется моя реализация фабрики).

И уж точно не нужно открывать браузер перед каждым методом и закрывать после каждого метода, так большая часть времени будет тратиться не на выполнение тестов, а на запуск браузеров.