Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Проблемы с объектом WebElement.Получает разные данные при одних и тех параметрах

webdriver
java
Теги: #<Tag:0x00007f7b620960e8> #<Tag:0x00007f7b62095fa8>

(Ярик Музика) #1

Привет. Вот недавно начал крутить selenium+java. Рекордером записал авторизацию в систему и решил ее немного усовершенствовать. Решил проверять на успешно\не успешно ли юзер входит в систему. Кейс простой: вводим данные, проверяем есть ли сообщение про “логин/пароль не верный”. Но вот с чем столкнулся: объект как-бы имеет рандомные значения при запусках(без изменений).Тоесть запускаю,смотрю - нужное поле ошибки есть, все ок. Запускаю снова, смотрю - поля уже нету. Скидываю листинг, прошу помощи в понимании,чего так и советов от экспертов :smile:

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class FirstTestCase {
private static WebDriver driver = null;

public static void main(String[] args) {
			
	driver = new FirefoxDriver();
	driver.get("адрес");
	driver.findElement(By.xpath(".//*[@id='login']")).sendKeys("логин");
	driver.findElement(By.xpath(".//*[@id='password']")).sendKeys("кривой_пассворд");
	driver.findElement(By.xpath(".//*[@id='loginForm']/button")).click();
	WebElement loginForm = driver.findElement(By.xpath(".//*[@id='loginForm']")); //блок в котором будет текст сообщающий об ошибке
	checkToNull(loginForm);	
String errorMsg = loginForm.getText();
System.out.println(errorMsg);
	
	if (errorMsg.contains("Введенный логин или пароль не верный")) {
		System.out.println("Login NOT successfully."); //сюда заходит ооооочень редко
	} else {
		System.out.println("Login successfully"); 
	}
	driver.quit();
}
private static void checkToNull(WebElement loginForm) {
	if(loginForm !=null){
		System.out.println("not null");
	}else{
		System.out.println("null");
	}
}

}


(Sergey Korol) #2

(Sergey Korol) #3

(Vladyslav Lopatynskyi) #4

Скорее всего селениум пытается достучаться до элемента раньше чем тот успевает догрузиться/измениться. Попробуйте поставить wait перед тем как будете брать текст ерора.


(Ярик Музика) #5

Как бы да но нет, так как то успевает то не успевает. Вейт делал, не помогло.


(Vladyslav Lopatynskyi) #6

Подскажите пожалуйста где ставили вейт?

P.S. попробуйте поставить сразу после нажатия на кнопку логин


(Ярик Музика) #7

так и делал.
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);


(Vladyslav Lopatynskyi) #8

Это не совсем то, что Вам надо. Сей строчкой Вы задаете максимальный вейт ожидания элемента для экземпляра драйвера.
В данном случае Вам нужно принудитльно подождать пару секунд.
Самый примитивный способ который Вы никогда не должны использовать в реальном тестовом проекте: Thread.sleep(2000) //ожидание 2ух секунд

Более адекватный способ кроется в explicity вейтах.
Попробуйте поставить этот 2- секундный принудительный вейт, если сработает. то усовершенсвуйте его до explicit wait для конкретного веб элемента


(Ярик Музика) #9

если повторно взять объект и вывести в консоль содержимые поля - то нужное поле будет, и все сработает. НО если не выводит в консоль - все работает снова как-то рендомно.


(Ярик Музика) #10

explicit wait решил проблему. Спасибо.
Оффтоп: порекомендуйте что то для чтения\просмотра


(Vladyslav Lopatynskyi) #11

Java - Юрий Ткач “Java для тестировщиков” видео уроки.
Selenium - к сожалению не подскажу, но у Алексея Баранцева должны быть какие то толковые курсы (software-testing.ru)


(Евгений Бухгаммер) #12

Не забудьте пометить решение, которое Вам помогло, это упрощает поиск для людей, кто столкнулся с возможной проблемой :slight_smile: