Перейти к содержимому

Фотография

Selenium+WebDriver+Ожидания. Как?


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 4

#1 KoLoB

KoLoB

    Новый участник

  • Members
  • Pip
  • 1 сообщений
  • ФИО:Sergii Opanasiuk

Отправлено 11 мая 2012 - 14:08

Добрый день.

Есть приложения на Ява.
Для него пишу автотест.

Есть функция отправки сообщения (Select tab - функция выбора и клика по нужному табу).
public static void sendMSG(String MSG){
		selectTab(2);
                //техтовое поле
		WebElement text = new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.id("page:j_id191:messageText")));
                //кнопка
		WebElement button = new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.id("page:j_id191:j_id208")));	
		text.sendKeys(MSG);
		button.click();
	}

Далее хочу отправить 100 сообщений кодом
for (int i=0; i<100; i++){
			sendMSG("autotest#"+i);
}

Первый раз все выполняет. На второй раз (при i==1) автотест падает со следующим ексепшином

getElementTagName execution failed;
Element does not exist in cache (WARNING: The server did not provide any stacktrace information)

Ошибка происходит в строчке button.click.

Но, если в функцию selectTab() в конце добавить Thread.sleep(500) - все работает.

В чем может быть проблемма и как её исправить.
Почему в первый раз скрипт обрабатывает?
  • 0

#2 julya08

julya08

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Юлия Мерцалова


Отправлено 31 июля 2012 - 13:13

Здравствуйте. У меня практически такая же проблема.
Есть код
@Test
  public void f() throws BiffException, IOException, InterruptedException 
  {
	  			
	  			FileInputStream fi = new FileInputStream("test.xls");
				Workbook workbook = Workbook.getWorkbook(fi);
				Sheet sheet = workbook.getSheet(0); 
				int my_Row = sheet.getRows(); //Определяем количество заполненных строк в xls файле					
				//Цикл прохода по xls файлу (Построчно)
				//Создаем новый объект класса	
				d1 = new FirefoxDriver();
				d1.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
				for   (int i=1;i<my_Row;i++) {			
					
					d1.get(url); //Открываем страницу добавления оборудования							
					//Расставляем данные из файла в соответствующие поля формы
					d1.findElement(By.name("Control.Place")).sendKeys(sheet.getCell(0,i).getContents());
					d1.findElement(By.name("Control.From")).sendKeys(sheet.getCell(1,i).getContents());		
					d1.findElement(By.name("Control.Model")).sendKeys(sheet.getCell(2,i).getContents());	
					d1.findElement(By.name("Control.SerialNo")).sendKeys(sheet.getCell(3,i).getContents());		
					d1.findElement(By.name("Control.IPAddress")).sendKeys(sheet.getCell(4,i).getContents());		
					d1.findElement(By.name("Control.Type")).sendKeys(sheet.getCell(5,i).getContents());
					
					...
		
					d1.findElement(By.name("ChannelDevices[3].Device.SerialNo")).sendKeys(sheet.getCell(20,i).getContents());		
				        d1.findElement(By.name("ChannelDevices[3].Device.Model")).sendKeys(sheet.getCell(21,i).getContents());		
				   // Thread.sleep(5000);				    
				        d1.findElement(By.xpath("//*[@id='main']/form/input")).click(); // Сабмитим 							
					
				 	//Thread.sleep(5000); //Ожидание загрузки страницы
					
					//	Проверяем наличие на странице заголовка, что означает прохождение теста, если заголовок не найден, тест провален
				        d1.findElement(By.xpath("//*[@id='main']/h2")).getText().contains("Список контроллеров");									   												
			}	
				d1.quit();	
  }
Первый раз проходит нормально, во второй раз застревает при нажатии на кнопку.
Если добавить Thread.sleep(5000), то отрабатывает нормально, но понятно, что это плохой вариант.
Почему так происходит, ведь элемент (кнопка) уже есть на странице?
Не успевает отработать скрипт проверки корректности заполнения формы? Тогда как правильно подождать?
  • 0

#3 neman

neman

    Активный участник

  • Members
  • PipPip
  • 142 сообщений
  • ФИО:Антон


Отправлено 31 июля 2012 - 15:52

KoLoB, а можно код selectTab()? Если вкратце, у вас где-то повторно используется элемент. Т.е. в первый раз успешно ткнули на WebElement. Затем страница обновилась. Еще раз пытаемся взаимодействовать с тем же инстансом WebElement, а DOM структура-то перестроилась, и в кэше браузера такого элемента уже нет. Надо этот элемент заново считать. Т.к. метод статический, вполне возможно где-то этот элемент один раз сохраняется, или неявно передается.

julya08, с какой ошибкой-то валится?
  • 0

#4 julya08

julya08

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Юлия Мерцалова


Отправлено 01 августа 2012 - 05:18

julya08, с какой ошибкой-то валится?

Падает с ошибкой

org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":"//*[@id='main']/h2"}

Это закономерно, элемент не найден, так как не произошел переход на страницу.
Но если закомментировать строку
Assert.assertTrue(d1.findElement(By.xpath("//*[@id='main']/h2")).getText().contains("Список контроллеров"));

то тест проходит без ошибок, значит, на элементе
d1.findElement(By.xpath("//*[@id='main']/form/input")).click(); // Сабмитим
клик происходит, только в этот момент это не кнопка по такому xpath? Не понимаю, почему при первоначальной загрузке тогда все проходит нормально.
  • 0

#5 julya08

julya08

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Юлия Мерцалова


Отправлено 01 августа 2012 - 06:55

Изменила click на submit и проблема исчезла.
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных