t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f9b025b6cc0> #<Tag:0x00007f9b025b6b08>

Привет. Вот недавно начал крутить 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");
	}
}

}

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

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

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

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

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

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

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

1 Симпатия

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

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

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

1 Симпатия

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