Я пытаюсь проверить страницу входа на моем сайте с помощью транспортира.
Если вы входите в систему неправильно, на сайте отображается сообщение "тост", которое появляется в течение 5 секунд, а затем исчезает (используя $timeout
).
Я использую следующий тест:
describe('[login]', ()->
it('should show a toast with an error if the password is wrong', ()->
username = element(select.model("user.username"))
password = element(select.model("user.password"))
loginButton = $('button[type=\'submit\']')
toast = $('.toaster')
# Verify that the toast isn't visible yet
expect(toast.isDisplayed()).toBe(false)
username.sendKeys("admin")
password.sendKeys("wrongpassword")
loginButton.click().then(()->
# Verify that toast appears and contains an error
toastMessage = $('.toast-message')
expect(toast.isDisplayed()).toBe(true)
expect(toastMessage.getText()).toBe("Invalid password")
)
)
)
Соответствующая разметка (нефрит) находится ниже:
.toaster(ng-show="messages.length")
.toast-message(ng-repeat="message in messages") {{message.body}}
Проблема заключается в отсутствии теста toastMessage
(он не может найти элемент). Кажется, он ждет, когда тост исчезнет, а затем запустит тест.
Я также попытался поставить тест toastMessage
вне обратного вызова then()
(я думаю, что это в значительной степени избыточно), но я получаю то же самое поведение.
Моя лучшая догадка заключается в том, что транспортир видит, что там работает $timeout
, и ждет его завершения до запуска следующего теста (ref поток управления транспортиром). Как мне обойти это и убедиться, что тест выполняется во время таймаута?
Update:
Следуя приведенному ниже предложению, я использовал browser.wait()
, чтобы ждать, пока тост станет видимым, а затем попытался запустить тест, когда обещание было разрешено. Это не сработало.
console.log "clicking button"
loginButton.click()
browser.wait((()-> toast.isDisplayed()),20000, "never visible").then(()->
console.log "looking for message"
toastMessage = $('.toaster')
expect(toastMessage.getText()).toBe("Invalid password")
)
Операторы console.log позволяют мне видеть, что происходит. Это серия событий, []
- это то, что я вижу в браузере.
clicking button
[toast appears]
[5 sec pass]
[toast disappears]
looking for message
[test fails]
Для дополнительной ясности в том, что происходит с тостером: у меня есть служба, которая по существу содержит массив сообщений. Тост-директива всегда находится на странице (шаблон - нефрит выше) и следит за сообщениями в службе тостов. Если появилось новое сообщение, он запускает следующий код:
scope.messages.push(newMessage)
# set a timeout to remove it afterwards.
$timeout(
()->
scope.messages.splice(0,1)
,
5000
)
Это подталкивает сообщение в массив сообщений в области 5 секунд, что и делает тост (через ng-show="messages.length"
).
Почему переносчик ждет, пока истечет срок тоста $timeout
, прежде чем перейти к испытаниям?