style change attribute javascript angularjs selenium-webdriver protractor automated-tests

javascript - change - ¿Cómo puedo esperar una condición?



title html (6)

Soy nuevo en transportador, y estoy tratando de implementar una prueba e2e. No sé si esta es la manera correcta de hacerlo, pero ... La página que quiero probar no está basada en una página angular completa, así que ... Tengo problemas.

En mi primera especificación tengo:

describe(''should open contact page'', function() { var ptor = protractor.getInstance(); beforeEach(function(){ var Login = require(''./util/Login''); new Login(ptor); });

He creado esta clase de inicio de sesión, pero después de iniciar sesión quiero abrir la página de contacto, pero el transportador intenta inmediatamente encontrar el elemento antes de que la página esté completamente cargada.

He intentado usar:

browser.driver.wait(function() { expect(browser.findElement(by.xpath("//a[@href=''#/contacts'']")).isDisplayed()); ptor.findElement(by.xpath("//a[@href=''#/contacts'']")).click(); });

Pero no funciona ... siempre trata de encontrar el elemento antes de que se cargue la página. Intenté esto también:

browser.driver.wait(function() { expect(ptor.isElementPresent(by.xpath("//a[@href=''#/contacts'']"))); ptor.findElement(by.xpath("//a[@href=''#/contacts'']")).click(); });

Puedo hacer eso usando browser.sleep(); pero no creo que sea una buena opción. ¿Alguna idea? En mi clase de inicio de sesión tengo:

ptor.ignoreSynchronization = true;

¿Cómo puedo esperar a este @href=''#/contacts antes de que el transportador intente hacer clic en él?


¿Has intentado poner la ng-app en la etiqueta <html> (suponiendo que esta parte del código está bajo tu control)? Esto resolvió muchos problemas de sincronización de inicialización para mí.


Finalmente descubro ...

var waitLoading = by.css(''#loading.loader-state-hidden''); browser.wait(function() { return ptor.isElementPresent(waitLoading); }, 8000); expect(ptor.isElementPresent(waitLoading)).toBeTruthy(); var openContact = by.xpath("//a[@href=''#/contacts'']"); element(openContact).click();

Con este transportador podría esperar ese elemento hasta que desaparezca la página de carga. Gracias por aquellos que trataron de ayudar a XD.


Gracias a las respuestas anteriores, este fue mi uso simplificado y actualizado

function waitFor (selector) { return browser.wait(function () { return browser.isElementPresent(by.css(selector)); }, 50000); }


Protractor 1.7.0 también ha presentado una nueva característica: Condiciones Esperadas .

Hay varias condiciones predefinidas para esperar explícitamente. En caso de que quiera esperar a que un elemento esté presente:

var EC = protractor.ExpectedConditions; var e = element(by.id(''xyz'')); browser.wait(EC.presenceOf(e), 10000); expect(e.isPresent()).toBeTruthy();

Ver también:


Tuve el mismo problema que estaba teniendo durante más tiempo al usar transportador. En mi prueba e2e comienzo en una aplicación no angular, luego me meto en una porción angular, luego regreso a una porción no angular. Hizo las cosas complicadas. La clave es entender las promesas y cómo funcionan. Aquí hay algunos ejemplos de mi código del mundo real en una prueba e2e que funciona. Esperando que esto te dé una idea de cómo estructurar tus pruebas. Probablemente sea una mala práctica en este código, por favor siéntete libre de mejorar esto, pero sé que funciona, tal vez no sea la mejor manera.

Para llegar a angular uso

var ptor; var events = require(''events''); var eventEmitter = new events.EventEmitter(); var secondClick = require(''./second-click''); beforeEach(function () { browser.driver.get(''http://localhost:8080/''); },10000); it("should start the test", function () { describe("starting", function () { it("should find the link and start the test", function(){ var elementToFind = by.linkText(''Start''); //what element we are looking for browser.driver.isElementPresent(elementToFind).then(function(isPresent){ expect(isPresent).toBe(true); //the test, kind of redundant but it helps pass or fail browser.driver.findElement(elementToFind).then(function(start){ start.click().then(function(){ //once we''ve found the element and its on the page click it!! :) ptor = protractor.getInstance(); //pass down protractor and the events to other files so we can emit events secondClick(eventEmitter, ptor); //this is your callback to keep going on to other actions or test in another file }); }); }); }); }); },60000);

Mientras en angular este código funciona

describe("type in a message ", function(){ it("should find and type in a random message", function(){ var elementToFind = by.css(''form textarea.limited''); browser.driver.isElementPresent(elementToFind).then(function(isPresent){ element(elementToFind).sendKeys(randomSentence).then(function(){ console.log("typed in random message"); continueOn(); }); }); }); },15000);

Después de salir angular

browser.driver.wait(function(){ console.log("polling for a firstName to appear"); return browser.driver.isElementPresent(by.name(''firstName'')).then(function(el){ return el === true; }); }). then(function(){ somefunctionToExecute() });

Espero que te dé una guía y te ayude!