Ожидание изменения статуса элемента (ajax-запроса). Есть идеи?
Автор DrBlast, 25 мая 2011 13:33
Сообщений в теме: 6
#1
Отправлено 25 мая 2011 - 13:33
Исходные данные:
Приложение написано с использованием Ajax
Есть текстовое поле с автоподстановкой, т.е. если в поле вводится какой-либо текст, то через секудну после окончания ввода происходит проверка корректности ввода:
1. Если значение найдено в справочнике, единственно и разрешено, то поле не подкрашивается, автодополняется при необходимости.
2. Если значение найдено в справочнике и оно не единственно, то поле подкрашивается красным и показывается выпадающее меню со списком подходящих значений.
3. Если значение не найдено в справочнике или значение запрещено к использованию, поле подкрашивается красным, в выпадающем меню показывается сообщение об ошибке.
Сообщение об ошибке - это тег span c атрибутом visible/ invisible
Сейчас реализован следующий алгоритм:
В метод передается поле, в которое осуществляется ввод, признак допустимости значения (true,false)
Поле поддерживает только нативные методы ввода, соответственно вводим буквы эмулируя нажатия клавиш
Затем вызываю fireEvent (в этот момент запускает отсчет времени на сервере - 1 сек)
Т.к. поиск происходит через 1сек и серверу необходимо какое-то время для поиска нужных значений, то делаю Thread.sleep(1500)
Далее делаю проверку п.2
Далее если значение не разрешено, то ожидаю появления ошибки.
Проблема
Т.к. в справочнике могут быть какие угодно значения вероятность выпадения п.1 и п.2 примерно 50 на 50
В связи с постоянно растущим справочником, времени слипа 1500мс не всегда хватает и тест падает.
Увеличение времени слипа - плохое решение:
Во первых, таких полей много, следовательно время прогона тестов значительно увеличится
Во вторых, справочник будет постоянно расти и предпочтительно просто выдавать warning, если время ожидания превышает 3сек.
Как-нибудь можно отказаться от слипа?
Если ставить задачу по простому, то необходимо дождаться окончания Ajax request, при этом нужно учесть, что по окончании реквеста страница может и не измениться.
Для этого казалось бы можно использовать библиотеку Richfaces-selenium,
но при попытке ожидания окончания реквеста предложенными в библиотеке методами происходит ошибка javascript Object expected или stackoverflow
В других случаях ожидания окончания запросов richfaces-selenium справляется замечательно :).
Приложение написано с использованием Ajax
Есть текстовое поле с автоподстановкой, т.е. если в поле вводится какой-либо текст, то через секудну после окончания ввода происходит проверка корректности ввода:
1. Если значение найдено в справочнике, единственно и разрешено, то поле не подкрашивается, автодополняется при необходимости.
2. Если значение найдено в справочнике и оно не единственно, то поле подкрашивается красным и показывается выпадающее меню со списком подходящих значений.
3. Если значение не найдено в справочнике или значение запрещено к использованию, поле подкрашивается красным, в выпадающем меню показывается сообщение об ошибке.
Сообщение об ошибке - это тег span c атрибутом visible/ invisible
Сейчас реализован следующий алгоритм:
В метод передается поле, в которое осуществляется ввод, признак допустимости значения (true,false)
Поле поддерживает только нативные методы ввода, соответственно вводим буквы эмулируя нажатия клавиш
Затем вызываю fireEvent (в этот момент запускает отсчет времени на сервере - 1 сек)
Т.к. поиск происходит через 1сек и серверу необходимо какое-то время для поиска нужных значений, то делаю Thread.sleep(1500)
Далее делаю проверку п.2
Далее если значение не разрешено, то ожидаю появления ошибки.
Проблема
Т.к. в справочнике могут быть какие угодно значения вероятность выпадения п.1 и п.2 примерно 50 на 50
В связи с постоянно растущим справочником, времени слипа 1500мс не всегда хватает и тест падает.
Увеличение времени слипа - плохое решение:
Во первых, таких полей много, следовательно время прогона тестов значительно увеличится
Во вторых, справочник будет постоянно расти и предпочтительно просто выдавать warning, если время ожидания превышает 3сек.
Как-нибудь можно отказаться от слипа?
Если ставить задачу по простому, то необходимо дождаться окончания Ajax request, при этом нужно учесть, что по окончании реквеста страница может и не измениться.
Для этого казалось бы можно использовать библиотеку Richfaces-selenium,
но при попытке ожидания окончания реквеста предложенными в библиотеке методами происходит ошибка javascript Object expected или stackoverflow
В других случаях ожидания окончания запросов richfaces-selenium справляется замечательно :).
Если ничего не помогает, прочтите наконец инструкцию!
#2
Отправлено 25 мая 2011 - 15:23
Попробуйте вот этот вариант: Selenium: ожидание завершения всех AJAX-запросов
#3
Отправлено 25 мая 2011 - 16:52
Попробуйте вот этот вариант: Selenium: ожидание завершения всех AJAX-запросов
У нас тоже типа ajax в приложении и методы, описанные в этой ссылке, в общем они (selenium.browserbot.getUserWindow().jQuery.active; и тому подобные) всегда выдают false.
Может нужен какой-то специфицеский ajax, который бы мог быть отловлен этой командой. =)
На счет уникальности, можно в тесте создать уникальный айтем, чтобы вы знали, что должен появиться один и только один.
И можно ведь ждать не ajax, а просто, что появился такой-то элемент или такой-то аттрибут стал равен тому-то. Типа style.display у этого самого списка, который появился. Html-то страницы меняется наверняка..
#4
Отправлено 25 мая 2011 - 18:24
Скорее всего ваши разработчики используют XMLHttpRequest напрямую, тогда такой способ не сработает, но сработает другой. Попросите разработчиков сделать вам "ручки" для проверки и добавьте поддержку этих "ручек" в предложенный вариант.
Либо ждите отображения элемента, но это уже не так интересно.
Либо ждите отображения элемента, но это уже не так интересно.
#5
Отправлено 26 мая 2011 - 10:01
Решил проблему следующим способом:
беру htmlSource после ввода значения, потом каждые полсекунды проверяю поменялся htmlsource или нет.
Как только поменялся - значит ответ пришел %)
jsf добавляет в разметку страницы какие-то технические атрибуты, например jQuery1306394837421="8".
также изменяется размер кэща.
беру htmlSource после ввода значения, потом каждые полсекунды проверяю поменялся htmlsource или нет.
Как только поменялся - значит ответ пришел %)
jsf добавляет в разметку страницы какие-то технические атрибуты, например jQuery1306394837421="8".
также изменяется размер кэща.
Если ничего не помогает, прочтите наконец инструкцию!
#6
Отправлено 26 мая 2011 - 11:33
Слишком ресурсоёмкое и ненадёжное решение. Проще ждать изменения видимости элемента в waitForCondition.
#7
Отправлено 26 мая 2011 - 11:39
Слишком ресурсоёмкое и ненадёжное решение. Проще ждать изменения видимости элемента в waitForCondition.
Согласен насчет ресурсоемкости... с точки зрения надежности в конкретном случае должно быть все нормально.
В первом случае (когда значение найдено) изменения видимости не происходит. Как я уже сказал выше происходит изменение значение атрибута jQuery324223, и значение атрибута sizcach в некоторых элементах.
При этом если появляется сообщение об ошибке или пол подкрашивается, то происходит изменнеие атрибута в других элементах.
Если ничего не помогает, прочтите наконец инструкцию!
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных