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

Фотография

Ожидание изменения статуса элемента (ajax-запроса). Есть идеи?


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

#1 DrBlast

DrBlast

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

  • Members
  • PipPip
  • 139 сообщений
  • ФИО:Евгений
  • Город:Москва

Отправлено 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 справляется замечательно :).
  • 0
Если ничего не помогает, прочтите наконец инструкцию!

#2 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 25 мая 2011 - 15:23

Попробуйте вот этот вариант: Selenium: ожидание завершения всех AJAX-запросов
  • 0

#3 alena b

alena b

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

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Alena

Отправлено 25 мая 2011 - 16:52

Попробуйте вот этот вариант: Selenium: ожидание завершения всех AJAX-запросов


У нас тоже типа ajax в приложении и методы, описанные в этой ссылке, в общем они (selenium.browserbot.getUserWindow().jQuery.active; и тому подобные) всегда выдают false.
Может нужен какой-то специфицеский ajax, который бы мог быть отловлен этой командой. =)

На счет уникальности, можно в тесте создать уникальный айтем, чтобы вы знали, что должен появиться один и только один.
И можно ведь ждать не ajax, а просто, что появился такой-то элемент или такой-то аттрибут стал равен тому-то. Типа style.display у этого самого списка, который появился. Html-то страницы меняется наверняка..
  • 0

#4 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 25 мая 2011 - 18:24

Скорее всего ваши разработчики используют XMLHttpRequest напрямую, тогда такой способ не сработает, но сработает другой. Попросите разработчиков сделать вам "ручки" для проверки и добавьте поддержку этих "ручек" в предложенный вариант.
Либо ждите отображения элемента, но это уже не так интересно.
  • 0

#5 DrBlast

DrBlast

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

  • Members
  • PipPip
  • 139 сообщений
  • ФИО:Евгений
  • Город:Москва

Отправлено 26 мая 2011 - 10:01

Решил проблему следующим способом:
беру htmlSource после ввода значения, потом каждые полсекунды проверяю поменялся htmlsource или нет.
Как только поменялся - значит ответ пришел %)

jsf добавляет в разметку страницы какие-то технические атрибуты, например jQuery1306394837421="8".
также изменяется размер кэща.
  • 0
Если ничего не помогает, прочтите наконец инструкцию!

#6 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 26 мая 2011 - 11:33

Слишком ресурсоёмкое и ненадёжное решение. Проще ждать изменения видимости элемента в waitForCondition.
  • 0

#7 DrBlast

DrBlast

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

  • Members
  • PipPip
  • 139 сообщений
  • ФИО:Евгений
  • Город:Москва

Отправлено 26 мая 2011 - 11:39

Слишком ресурсоёмкое и ненадёжное решение. Проще ждать изменения видимости элемента в waitForCondition.


Согласен насчет ресурсоемкости... с точки зрения надежности в конкретном случае должно быть все нормально.
В первом случае (когда значение найдено) изменения видимости не происходит. Как я уже сказал выше происходит изменение значение атрибута jQuery324223, и значение атрибута sizcach в некоторых элементах.
При этом если появляется сообщение об ошибке или пол подкрашивается, то происходит изменнеие атрибута в других элементах.
  • 0
Если ничего не помогает, прочтите наконец инструкцию!


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

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