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

Фотография

Selenium ошибка при вызове метода wait_for_page_to_load


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

#1 rbolsh

rbolsh

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

  • Members
  • Pip
  • 3 сообщений

Отправлено 22 октября 2010 - 15:50

При вызове метода wait_for_page_to_load тест падает с сообщением об ошибке: Exception: Current window or frame is closed!
Если кто сталкивался, подскажите как победить проблему?

Исходные данные
В тесте была проверка, с использованием метода wait_for_pop_up().

Шаги
2. Вызвать метод wait_for_page_to_load().
3. Убедиться, что тест рушится с ошибкой:
File "C:\Users\rbolsh\Работа\E-doc\autotests\E-doc\main.py", line 124, in search
self.selenium.wait_for_page_to_load(timeOut)
File "C:\Python26\lib\selenium.py", line 1730, in wait_for_page_to_load
self.do_command("waitForPageToLoad", [timeout,])
File "C:\Python26\lib\selenium.py", line 215, in do_command
raise Exception, data
Exception: Current window or frame is closed!

Тест выполняется если
1. Вместо метода wait_for_page_to_load() поставить паузу, или вообще его убрать.
2. Убрать проверку, с использованием метода wait_for_pop_up()

PS: До выхода этой версии приложения тесты отрабатывали корректно. Визуально в приложении все работает правильно.
Странно, что падает именно на вызове метода wait_for_page_to_load(), а с паузой вместо него работает.
  • 0

#2 ekulgavaya

ekulgavaya

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Елена
  • Город:Minsk, Belarus


Отправлено 25 октября 2010 - 08:21

Здравствуйте.

Я сталкивалась с подобной проблемой. Дело было в том, что всплывающее окно на самом деле не было таковым в том смысле, в котором его понимает селениум. Просто генерировалась таблица на странице в результате чего обновлялась не вся страница а только ее часть.

Попробуйте ждать не страницу, а какой-нибудь элемент pop-upa.

Если Вы используете Selenium IDE, воспользуйтесь методом waitForElementPresent, на java это будет выглядеть так:

for (int second = 0;; second++) {
if (second >= 60) fail("timeout");
try { if (selenium.isElementPresent("some_id")) break; } catch (Exception e) {}
Thread.sleep(1000);
  • 0
In God we trust, the rest we test.

#3 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

Отправлено 25 октября 2010 - 13:02

версия для php обработчика click and wait

$this->click('//a[@onclick=\'PriceEdit1("");\']'); //тот самый клик

$flag = false;
for ($i=1;$i<=(WAIT/1000);$i++)
{
$flag = $this->isElementPresent('//td[text()=\'ГЕНЕРАЦИЯ ПРАЙС-ЛИСТА\' and @class=\'head_main_table\']');
sleep(1);
}
if ($flag === false) {$this->fail('Oops! I did it again!');}

где
define ('WAIT', 30000);
//td[text()=\'ГЕНЕРАЦИЯ ПРАЙС-ЛИСТА\' and @class=\'head_main_table\']
- ожидаемый элемент на странице

PS чуть не забыл, всё это оформляется в виде отдельной функции и перед sleep(1); пишется if ($flag===true){return;} - иначе придётся ждать сколько положено. ))

function go_to_step1 ()
    {
      $this->click('//a[text()=\'Добавить\']');
      $flag = false;
      for ($i=1;$i<=(WAIT/1000);$i++)
      {
          $flag = $this->isElementPresent('//td[text()=\'ГЕНЕРАЦИЯ ПРАЙС-ЛИСТА\' and @class=\'head_main_table\']');
          if ($flag === true) {return;}
          sleep(1);
      }
      if ($flag === false) {$this->fail('Oops! I did it again!');}
    }

  • 0

#4 madboy4ik

madboy4ik

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

  • Members
  • Pip
  • 62 сообщений
  • ФИО:Александр Александрович
  • Город:Kharkov

Отправлено 25 октября 2010 - 14:08

Я бы посоветовал сделать метод waitElement ну или как вы там его назовёте, использовать такую конструкцию


			 boolean flag = false;
			 do{
				 for (int i=0; i<15; i++)
				 {
					 Thread.sleep(Long.valueOf(time));
					 if (selenium.isElementPresent(elementary))
					 {
						 System.out.println("Element "+elementary+ " is present");
						 flag=true;
						 break;
					 }
					 if (i==14) //можно 14 можно сколько угодно
					 {
						 System.out.println("Element was waiting  "+i + " and didn't appeared");
						 flag=true;
						  System.out.println"Element "+elementary+ "is absent");
					 }
				 }
			 }while(!flag);


  • 0

#5 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 25 октября 2010 - 14:44

http://www.software-...aiting-events-2

(В конце статьи имеется ссылка на архив с исходниками)
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#6 rbolsh

rbolsh

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

  • Members
  • Pip
  • 3 сообщений

Отправлено 25 октября 2010 - 15:00

__Шаги__
  • Открываю страницу Список сотрудников.
  • Открываю карточку одного из сотрудников, карточка открывается в новой вкладке. Использую метод self.selenium.wait_for_pop_up("", timeOut) для ожидания загрузки этого окна.
  • Нажимаю кнопку Отмена. При этом карточка закрывается и фокус вновь переводится на форму Список сотрудников. Форма Список сотрудников при этом обновляется (мне кажется проблема возникает из-за обновления формы).
  • Далее я устанавливаю активным окном форму Список сотрудников и кликаю на кнопку Получить новых.
  • После этого стоит метод self.selenium.wait_for_page_to_load(timeOut). И на его выполнении тест падает с ошибкой.

См. действия на флеш-видео в файле - ссылка на файлообменник

PS: похоже на ошибку в самом Selenium.
  • 0

#7 ekulgavaya

ekulgavaya

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Елена
  • Город:Minsk, Belarus


Отправлено 27 октября 2010 - 07:08

К сожалению не могу посмотреть ролик. А что должно произойти при нажатии на кнопку Получить новых?
  • 0
In God we trust, the rest we test.

#8 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 27 октября 2010 - 08:29

карточка открывается в новой вкладке

Вот это ключевой момент. Selenium не умеет работать с вкладками.
Сделайте отдельный профиль для тестирования и отключите в нём вкладки.
Тогда popup будет открываться в новом окне, и Selenium нормально сможет с ним работать.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#9 rbolsh

rbolsh

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

  • Members
  • Pip
  • 3 сообщений

Отправлено 27 октября 2010 - 10:56

Описание действий на видео
  • На родительском окне кликаю по ссылке на дочернее окно.
  • Дочернее окно открывается в новом окне.
  • После открытия я выбираю новое окно и устанавливаю фокус на нём.
  • В новом окне я нажимаю на кнопку Отмена.
  • После нажатия на кнопку форма закрывается и родительское окно обновляется.
  • Выбираю родительское окно и устанавливаю фокус на нём.
  • Кликаю по ссылке **Получить новых**.
  • Тест падает на методе wait_for_page_to_load()...

Итоги
После нажатия на ссылку **Получить новых** в этом же окне открывается форма получения новых сотрудников. Если я не проверяю дочернее окно, а сразу кликаю на ссылку **Получить новых** - всё корректно отрабатывает. Для обхода этой ошибки пришлось разбить тест на несколько частей. Один тест проверяет дочернее окно, а другой ссылку **Получить новых**.
В прошлой версии приложения, после нажатия на кнопку **Отмена**(см. п. 5), родительское окно не обновлялось и тест работал без сбоев.
Похоже, что Selenium после обновления родительского окна не может выполнять метод wait_for_page_to_load(), так как считает окно закрытым. Но при этом он может находить на этом окне ссылки и кликать по ним.
  • 0


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

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