Testando o conteúdo de um elemento temporário com transferidor
Estou tentando testar a página de login no meu site usando o transferidor.
Se você efetuar login incorretamente, o site exibirá uma mensagem "brinde" que será exibida por 5 segundos e desaparecerá (usando$timeout
)
Estou usando o seguinte teste:
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")
)
)
)
A marcação relevante (jade) está abaixo:
.toaster(ng-show="messages.length")
.toast-message(ng-repeat="message in messages") {{message.body}}
O problema é otoastMessage
teste está falhando (não consegue encontrar o elemento). Parece esperar a torrada desaparecer eentão executando o teste.
Eu também tentei colocar otoastMessage
teste fora dothen()
retorno de chamada (acho que isso é bastante redundante de qualquer maneira), mas recebo exatamente o mesmo comportamento.
Meu melhor palpite é que o transferidor vê que há uma$timeout
em execução e aguarda a conclusão antes de executar o próximo teste (reffluxo de controle de transferidor) Como resolver isso e garantir que o teste seja executadodurante o tempo limite?
Atualizar:
Seguindo a sugestão abaixo, useibrowser.wait()
para esperar o brinde ficar visível, depois tentou executar o teste quando a promessa foi resolvida. Não deu certo.
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")
)
As instruções console.log me permitem ver o que está acontecendo. Esta é a série de eventos, o[]
são o que vejo acontecendo no navegador.
clicking button
[toast appears]
[5 sec pass]
[toast disappears]
looking for message
[test fails]
Para maior clareza sobre o que está acontecendo com a torradeira: Eu tenho um serviço que essencialmente contém uma série de mensagens. A diretiva de brinde está sempre na página (o modelo é o jade acima) e observa as mensagens no serviço de brinde. Se houver uma nova mensagem, ele executará o seguinte código:
scope.messages.push(newMessage)
# set a timeout to remove it afterwards.
$timeout(
()->
scope.messages.splice(0,1)
,
5000
)
Isso envia a mensagem para a matriz de mensagens no escopo por 5 segundos, e é isso que faz o brinde aparecer (viang-show="messages.length"
)
Por que o transferidor está esperando o brinde?$timeout
expirar antes de passar para os testes?