Методы ожидания для watir-webdriver, неудачного с JS / AJAX и новой загрузкой страницы (ошибка не найдена в кеше) - PullRequest
1 голос
/ 12 августа 2011

Я тестирую внутренний сайт, созданный на витрине магазина Magento.Во время оформления заказа некоторые части формы скрыты (стиль: отсутствует) до заполнения предыдущего раздела.Эти части обычно нарушали бы сценарий, но использование when_present для первого элемента скрытой формы решило эту проблему.

Однако кнопка Submit Order не работает с этими же методами.Сегодня я работал с нашим ведущим разработчиком, чтобы убедиться, что единственное различие между этой кнопкой и предыдущими кнопками формы заключается в том, что загружается новая страница (новый URL, новый статус «выполнено» в браузере).

кристально чистый:

  1. Пользователь вводит имя, адрес, адрес электронной почты и щелкает «Продолжить» => JS «загрузка» анимации вращается, когда панель «Общие» закрывается, а панель «Способ доставки» расширяется, все на одной странице.
  2. Пользователь нажимает кнопку «Отправить заказ» => JS «загрузка» анимации вращается, после завершения браузер переходит к / success / (новая страница) с проверяемыми элементами.
  3. Если достаточно временичтобы завершить (оператор сна), тест проходит успешно.

Вот несколько-псевдокод формы и нажмите кнопку Отправить:

def complete_form(data = {})
  data = DEFAULT_DATA.merge (data)
  select_guest
  continue_button.click  #proceed to billing panel
  enter_billing_and_shipping_info(data)
  enter_additional_information(data)

  place_order_button.when_present.click  #submit form
  #sleep 2  #this succeeds, but is undesirable
  thank_you_message.wait_until_present #I do not actually appear to wait until anything is present
end #

def enter_billing_and_shipping_info(data)
  billing_first_name.when_present.value = data['First Name'] #I work!
  billing_last_name.value = data['Last Name']
  #more fields
end #

Из шагов:

thank_you_message.should include("Yippee")

Сценарий завершается сбоем двумя различными способами в зависимости от того, как быстро отвечает сайт:

  1. завершается с сообщением о том, что ожидаемое сообщение с благодарностью не найдено - scrПри обнаружении ошибки во время ошибки отображается страница «Оформление заказа», а НЕ страница «Спасибо», с отображаемой анимацией «загрузки».(ожидается, что «Оформить заказ» будет включать «Ваш заказ был получен») * Ошибка 1024 *
  2. с ошибкой «Элемент не найден в кэше» - на снимке экрана в этом случае отображается страница «Спасибо», содержащая текст, который мыищите

Другие методы, такие как Watir :: Wait.until или до {} do, привели к тому же поведению.

  • Windows 7 6432-разрядная версия Windows XP
  • ruby ​​1.9.2p290 (2011-07-09) [i386-mingw32]
  • огурец (1.0.2)
  • rspec (1.3.2)
  • watir-webdriver (0.3.0)

Обновление 8-15 Попытка решения № 1:

  place_order_button.when_present.click  #complete form
  ajax_submit_image.wait_while_present

Тот же конечный результат - сценарий завершается без сообщения об успехе, скриншот показывает загрузочную картинку Ajax в середине вращения.И этот, и предыдущий метод ДОЛЖНЫ работать, но, похоже, не имеют никакого эффекта.Я проверил, что могу получить доступ к изображению, используя локаторы в скрипте (img src match).

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

Рассматривали ли вы использование «загрузки анимации» (которая может быть просто анимированным GIF или подобным), чтобы узнать, что вам следует ждать?из моих сценариев, где анимация была простым графическим файлом, который делался видимым или нет на клиентском javascript.Таким образом, мой цикл ожидания состоял из короткого сна и проверки, присутствовала ли анимация, выходя из нее, как только она исчезла.

1 голос
/ 12 августа 2011

Стоит рассмотреть один вариант - запросить возможность проверки флага в самом приложении, которое позволяет узнать, запущен ли асинхронный процесс. В одном веб-приложении, насыщенном AJAX, которое я тестировал, всякий раз, когда срабатывает XRH или таймер, мы устанавливаем атрибут для тега body, например, AjaxStarted, и последнее, что должен делать любой XHR или таймер, - установить этот атрибут в AjaxStopped. Таким образом, в любом контексте (даже там, где может происходить несколько асинхронных процессов, у меня был один простой метод для вызова, продолжать или нет).

Вы можете прочитать подробности того, что мы сделали, и некоторые другие решения, которые мы попробовали, здесь: http://testingjeff.wordpress.com/2009/10/21/relief-for-the-pain-of-waiting-for-ajax-elements-on-the-page/

...