Selenium ошибка при вызове метода wait_for_page_to_load
Автор rbolsh, 22 окт 2010 15:50
Сообщений в теме: 8
#1
Отправлено 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(), а с паузой вместо него работает.
Если кто сталкивался, подскажите как победить проблему?
Исходные данные
В тесте была проверка, с использованием метода 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(), а с паузой вместо него работает.
#2
Отправлено 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);
Я сталкивалась с подобной проблемой. Дело было в том, что всплывающее окно на самом деле не было таковым в том смысле, в котором его понимает селениум. Просто генерировалась таблица на странице в результате чего обновлялась не вся страница а только ее часть.
Попробуйте ждать не страницу, а какой-нибудь элемент 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);
In God we trust, the rest we test.
#3
Отправлено 25 октября 2010 - 13:02
версия для php обработчика click and wait
где
PS чуть не забыл, всё это оформляется в виде отдельной функции и перед sleep(1); пишется if ($flag===true){return;} - иначе придётся ждать сколько положено. ))
$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!');} }
#4
Отправлено 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);
#5
Отправлено 25 октября 2010 - 14:44
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#6
Отправлено 25 октября 2010 - 15:00
__Шаги__
См. действия на флеш-видео в файле - ссылка на файлообменник
PS: похоже на ошибку в самом Selenium.
- Открываю страницу Список сотрудников.
- Открываю карточку одного из сотрудников, карточка открывается в новой вкладке. Использую метод self.selenium.wait_for_pop_up("", timeOut) для ожидания загрузки этого окна.
- Нажимаю кнопку Отмена. При этом карточка закрывается и фокус вновь переводится на форму Список сотрудников. Форма Список сотрудников при этом обновляется (мне кажется проблема возникает из-за обновления формы).
- Далее я устанавливаю активным окном форму Список сотрудников и кликаю на кнопку Получить новых.
- После этого стоит метод self.selenium.wait_for_page_to_load(timeOut). И на его выполнении тест падает с ошибкой.
См. действия на флеш-видео в файле - ссылка на файлообменник
PS: похоже на ошибку в самом Selenium.
#7
Отправлено 27 октября 2010 - 07:08
К сожалению не могу посмотреть ролик. А что должно произойти при нажатии на кнопку Получить новых?
In God we trust, the rest we test.
#8
Отправлено 27 октября 2010 - 08:29
Вот это ключевой момент. Selenium не умеет работать с вкладками.карточка открывается в новой вкладке
Сделайте отдельный профиль для тестирования и отключите в нём вкладки.
Тогда popup будет открываться в новом окне, и Selenium нормально сможет с ним работать.
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#9
Отправлено 27 октября 2010 - 10:56
Описание действий на видео
Итоги
После нажатия на ссылку **Получить новых** в этом же окне открывается форма получения новых сотрудников. Если я не проверяю дочернее окно, а сразу кликаю на ссылку **Получить новых** - всё корректно отрабатывает. Для обхода этой ошибки пришлось разбить тест на несколько частей. Один тест проверяет дочернее окно, а другой ссылку **Получить новых**.
В прошлой версии приложения, после нажатия на кнопку **Отмена**(см. п. 5), родительское окно не обновлялось и тест работал без сбоев.
Похоже, что Selenium после обновления родительского окна не может выполнять метод wait_for_page_to_load(), так как считает окно закрытым. Но при этом он может находить на этом окне ссылки и кликать по ним.
- На родительском окне кликаю по ссылке на дочернее окно.
- Дочернее окно открывается в новом окне.
- После открытия я выбираю новое окно и устанавливаю фокус на нём.
- В новом окне я нажимаю на кнопку Отмена.
- После нажатия на кнопку форма закрывается и родительское окно обновляется.
- Выбираю родительское окно и устанавливаю фокус на нём.
- Кликаю по ссылке **Получить новых**.
- Тест падает на методе wait_for_page_to_load()...
Итоги
После нажатия на ссылку **Получить новых** в этом же окне открывается форма получения новых сотрудников. Если я не проверяю дочернее окно, а сразу кликаю на ссылку **Получить новых** - всё корректно отрабатывает. Для обхода этой ошибки пришлось разбить тест на несколько частей. Один тест проверяет дочернее окно, а другой ссылку **Получить новых**.
В прошлой версии приложения, после нажатия на кнопку **Отмена**(см. п. 5), родительское окно не обновлялось и тест работал без сбоев.
Похоже, что Selenium после обновления родительского окна не может выполнять метод wait_for_page_to_load(), так как считает окно закрытым. Но при этом он может находить на этом окне ссылки и кликать по ним.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных