e2e app angularjs oauth protractor angularjs-e2e

angularjs - app - protractor click



Prueba del transportador e2e que requiere autenticación (2)

Tengo un objeto de página de autenticación de Google (a continuación) que hace todo el trabajo por mí.

La clave aquí es "isAngularSite (false)"; La función witch instruye a webdriver si estamos ingresando al sitio web ''angular'' o ''no angular''. (implementación abajo).

/* global element, browser, by */ ''use strict''; var GOOGLE_USERNAME = ''[email protected]''; var GOOGLE_PASSWORD = ''password''; var ec = protractor.ExpectedConditions; var Google = function () { this.emailInput = element(by.id(''Email'')); this.passwordInput = element(by.id(''Passwd'')); this.nextButton = element(by.id(''next'')); this.signInButton = element(by.id(''signIn'')); this.approveAccess = element(by.id(''submit_approve_access'')); this.loginToGoogle = function () { var self = this; /* Entering non angular site, it instructs webdriver to switch to synchronous mode. At this point I assume we are on google login page */ isAngularSite(false); this.emailInput.sendKeys(GOOGLE_USERNAME); this.nextButton.click(); this.passwordInput.isPresent().then(function () { browser.wait(ec.visibilityOf(self.passwordInput), BROWSER_WAIT).then(function () { self.passwordInput.sendKeys(GOOGLE_PASSWORD); self.signInButton.click(); browser.wait(ec.elementToBeClickable(self.approveAccess), BROWSER_WAIT).then(function () { self.approveAccess.click(); /* Now we are being redirected to our app, switch back to async mode (page with angular) */ isAngularSite(true); }); }); }); } } module.exports = new Google();

--- tirar esto en protractor.conf.js

onPrepare: function () { global.isAngularSite = function (flag) { console.log(''Switching to '' + (flag ? ''Asynchronous'' : ''Synchronous'') + '' mode.'') browser.ignoreSynchronization = !flag; }, global.BROWSER_WAIT = 5000; }

--- así es como lo usarías:

it(''should login though google'', function(done) { mainPage.loginBtn.click(). then(function () { loginPage.connectWithGoogleBtn.click(); googlePage.loginToGoogle(); browser.wait(mainPage.userName.isPresent()). then(function () { expect(mainPage.userName.getText()). toEqual(''[email protected]''); done(); }); }); });

Tengo una aplicación Angular que requiere autenticación con Google, otorgamiento de algunos ámbitos, etc., y estoy tratando de configurar pruebas automáticas de e2e para ello. El transportador funciona bien para mí en general, pero cuando llegamos a la página de autenticación de Google, nos registramos y nos redireccionamos, el transportador falla la prueba porque "el documento se descarga mientras se espera el resultado".

¿Existe alguna herramienta o técnica que pueda usar para autenticarme en una cuenta de google de desarrollo antes de cada prueba?

Si pudiera obtener el marco para que se mantenga durante un segundo mientras el controlador de la web, que es sencillo, controla el inicio de sesión, y solo activa las cosas angulares después de llegar a mi página de destino, ¡sería perfecto!


La clave es usar browser.driver.get lugar de browser.get , y usar browser.driver.sleep(someMilliseconds) para permitir la carga angular en su destino final antes de usar los comandos específicos del ángulo.

Aquí está mi especificación de transportador de trabajo que primero autoriza a Google y luego cuenta los elementos en un repetidor:

it(''allows the user to add new slides'', function () { browser.driver.get(''http://localhost:3000/editor/?state=%7B"action":"create"%7D''); // at this point my server redirects to google''s auth page, so let''s log in var emailInput = browser.driver.findElement(by.id(''Email'')); emailInput.sendKeys(''[email protected]''); var passwordInput = browser.driver.findElement(by.id(''Passwd'')); passwordInput.sendKeys(''pa$sWo2d''); //you should not commit this to VCS var signInButton = browser.driver.findElement(by.id(''signIn'')); signInButton.click(); // we''re about to authorize some permissions, but the button isn''t enabled for a second browser.driver.sleep(1500); var submitApproveAccess = browser.driver.findElement(by.id(''submit_approve_access'')); submitApproveAccess.click(); // this nap is necessary to let angular load. browser.driver.sleep(10000); // at this point the protractor functions have something to hook into and // will work as normal! element(by.id(''new-slide-dropdown-trigger'')).click(); element(by.id(''new-text-slide-trigger'')).click(); var slideList = element.all(by.repeater(''slide in deck.getSlides()'')); slideList.then(function(slideElements) { expect(slideElements.length).toEqual(1); }); });