Тестирование RequireJS приложения с FluentAutomation?
Я пытаюсь написать несколько тестов пользовательского интерфейса для приложения Backbone на основе RequireJS, используя FluentAutomation.SeleniumWebDriver и NUnit. HTML-страница, о которой идет речь, содержит типичный data-main
атрибут для загрузки модуля RequireJS для приложения. Моя борьба заключается в том, чтобы правильно определить, когда приложение полностью загружено этими инструментами; единственное, что я до сих пор работал последовательно - это использование явного ожидания в секундах, например:
I.Open("http://myapp")
.Wait(5)
.Enter("foo").In("input[name=username]")
.Enter("bar").In("input[name=password]")
.Click("button")
.Wait(5)
.Expect.Text("Welcome").In("#welcome");
Это не идеально - мой тест, как написано выше, всегда будет выполняться не менее 10 секунд, тогда как на самом деле приложение может быть "готово" гораздо быстрее, чем это. То, что я хотел бы сделать, это что-то вроде этого:
I.Open("http://myapp")
.WaitUntil(() => I.Assert.Exists("input[name=username]"))
.Enter("foo").In("input[name=username]")
.Enter("bar").In("input[name=password]")
.Click("button")
.WaitUntil(() => I.Assert.Exists("#welcome"))
.Expect.Text("Welcome").In("#welcome");
Однако это не работает - использование WaitUntil здесь, по-видимому, препятствует загрузке приложения по неясным для меня причинам, поскольку я просто получаю исключения тайм-аута после периода ожидания по умолчанию (30 секунд), заявляя, что оно не может найти рассматриваемый элемент в течение этого периода времени.
Я вижу, что Selenium 2 предоставляет WebDriverWait для такого сценария, и, возможно, это сработало бы здесь, но я не уверен, как бы я использовал это в FluentAutomation (и быстрый поиск кода FluentAutomation в GitHub, похоже, не указывает на то, что он находится в использовать в библиотеке).
Что я могу использовать в FluentAutomation для правильного ожидания готовности модуля RequireJS (или загруженного им DOM)?
Дополнительные детали:
Это может не быть проблемой совместимости RequireJS. Я посмотрел дальше в приложение и обнаружил, что то, что происходит после Click("button")
на самом деле window.location.replace
- не требуется загрузка асинхронного модуля RequireJS. Очевидно, это единственное место в приложении. Итак, это window.location
перенаправить известный сценарий, который может вызвать проблемы с WaitUntil
и есть ли альтернативный подход (кроме простого Wait(5)
) что бы правильно с этим справиться?