selenium webdriver - node - Selenium-Webdriver w/Chai as Promised y Mocha no pueden esperar
chai expect (1)
Tengo una prueba simple de coffeescript con Selenium-Webdriver utilizando Chai-as-Promised y Mocha, que se supone que prueba una página web que tengo que usa una llamada AJAX para hacer la autenticación una vez que se presiona un botón de inicio de sesión:
selenium = require ''selenium-webdriver''
chai = require ''chai''
chai.use require ''chai-as-promised''
expect = chai.expect
before ->
@timeout 10000
@driver = new selenium.Builder()
.withCapabilities(selenium.Capabilities.chrome())
.build()
@driver.getWindowHandle()
after ->
@driver.quit()
describe ''Test Login'', ->
beforeEach ->
@driver.get ''http://DOMAIN/login/''
it ''submitting login'', ->
@driver.findElement(id: ''email'').sendKeys(''[email protected]'')
@driver.findElement(id: ''password'').sendKeys(''foo'')
@driver.findElement(css: ''#login-btn'').submit()
expect(@driver.findElement(id: ''#login-profile'')).to.eventually.be.true
expect(@driver.getCurrentUrl()).to.eventually.equal ''http://DOMAIN/profile/''
La forma en que funciona la página de inicio de sesión es que una vez que hace clic en iniciar sesión se realiza una llamada AJAX, y si el inicio de sesión es exitoso, la página se redirige a través de document.location.href
a / profile /.
Sin embargo, cuando se ejecuta este script, el navegador se abre y va a la página de inicio de sesión, se completa correctamente, pero en cuanto se hace clic falla.
Creo que lo que está sucediendo es que el navegador no está esperando el resultado de la llamada AJAX y el redireccionamiento posterior, pero creo que la idea de promesas sería que eventualmente esperarían hasta algún período de tiempo de espera para verificar que #login-profile
necesitaría mostrar arriba.
¿Debo agregar eso explícitamente? ¿Si es así, cómo?
Pude hacer que esto funcionara usando la sintaxis de espera:
@driver.wait(-> driver.isElementPresent selenium.By.id("login-profile"), 10000)
gracias a esta publicación
La prueba completa:
it ''submitting login'', ->
driver = @driver
@driver.findElement(id: ''email'').sendKeys(''[email protected]'')
@driver.findElement(id: ''password'').sendKeys(''foo'')
@driver.findElement(css: ''#login-btn'').submit()
@driver.wait(-> driver.isElementPresent selenium.By.id("login-profile"), 10000)
expect(@driver.getCurrentUrl()).to.eventually.equal ''http://DOMAIN/profile/''