describe('my homepage', function() {
var ptor = protractor.getInstance();
beforeEach(function(){
// ptor.ignoreSynchronization = true;
ptor.get('http://localhost/myApp/home.html');
// ptor.sleep(5000);
})
describe('login', function(){
var email = element.all(protractor.By.id('email'))
, pass = ptor.findElement(protractor.By.id('password'))
, loginBtn = ptor.findElement(protractor.By.css('#login button'))
;
it('should input and login', function(){
// email.then(function(obj){
// console.log('email', obj)
// })
email.sendKeys('[email protected]');
pass.sendKeys('shakalakabam');
loginBtn.click();
})
})
});
le code ci-dessus renvoie
Error: Error while waiting for Protractor to sync with the page: {}
et je ne sais pas pourquoi, ptor charge la page correctement, il semble que ce soit le choix des éléments qui échoue.
À SSHMSH:
Merci, vous avez presque raison et vous m'avez donné la bonne philosophie. L'important est donc de ptor.sleep (3000) pour que chaque page attende jusqu'à ce que ptor soit synchronisé avec le projet.
J'ai le même message d'erreur (angulaire 1.2.13). Mes tests ont commencé trop tôt et Protractor n'a pas semblé attendre que Angular soit chargé.
Il est apparu que j'avais mal configuré le fichier de configuration du rapporteur. Lorsque la directive ng-app
n'est pas définie sur l'élément BODY, mais sur un descendant, vous devez ajuster la propriété rootElement
dans votre fichier de configuration du rapporteur au sélecteur qui définit votre élément racine angulaire, par exemple:
// protractor-conf.js
rootElement: '.my-app',
quand votre HTML est:
<div ng-app="myApp" class="my-app">
J'utilise ChromeDriver et l'erreur ci-dessus se produit généralement lors du premier test. J'ai réussi à le contourner comme ça:
ptor.ignoreSynchronization = true;
ptor.get(targetUrl);
ptor.wait(
function() {
return ptor.driver.getCurrentUrl().then(
function(url) {
return targetUrl == url;
});
}, 2000, 'It\'s taking too long to load ' + targetUrl + '!'
);
Essentiellement, vous attendez que l'URL actuelle du navigateur devienne ce que vous avez demandé et autorisiez 2s pour que cela se produise .. Vous voudrez probablement changer le ignoreSynchronization = false
après, éventuellement en l'enveloppant dans une ptor.wait(...)
. Se demander si le commentaire de ptor.sleep(5000);
ne vous aiderait pas?
EDIT: Après quelques expériences avec Promise/Différé, j’ai réalisé que la bonne manière de le faire serait la suivante:
loginBtn.click().then(function () {
ptor.getCurrentUrl(targetUrl).then(function (newURL){
expect(newURL).toBe(whatItShouldBe);
});
});
Veuillez noter que si vous changez l’URL (c’est-à-dire que vous vous éloignez de la page activée par AngularJS actuelle, ce qui implique que la bibliothèque AngularJS doit recharger et initier), il n’existe aucun moyen éviter l'appel ptor.sleep(...)
. Ce qui précède ne fonctionnera que si vous restez sur la même page angulaire, mais changez la partie de l'URL après le hashtag.
Dans mon cas, j'ai rencontré l'erreur avec le code suivant:
describe("application", function() {
it("should set the title", function() {
browser.getTitle().then(function(title) {
expect(title).toEqual("Welcome");
});
});
});
Corrigé en faisant ceci:
describe("application", function() {
it("should set the title", function() {
browser.get("#/home").then(function() {
return browser.getTitle();
}).then(function(title) {
expect(title).toEqual("Welcome");
});
});
});
En d'autres termes, j'oubliais de naviguer vers la page que je voulais tester, donc Protractor avait du mal à trouver Angular. D'oh!
Le paramètre rootElement
de l'objet exports.config
défini dans votre fichier de configuration de protractor doit correspondre à l'élément contenant votre directive ng-app
. Il n'est pas nécessaire que cela identifie uniquement l'élément - "div" suffit si la directive est dans une variable div
, comme dans mon cas.
De referenceConf.js
:
// Selector for the element housing the angular app - this defaults to
// body, but is necessary if ng-app is on a descendant of <body>
rootElement: 'div',
J'ai commencé à travailler avec Protractor en observant l'excellente egghead.io lecture , où il utilise un exports.config
condensé. La valeur par défaut étant rootElement
et body
, il n'y a aucune indication sur ce qui ne va pas avec votre configuration si vous ne commencez pas par une copie de la configuration de référence fournie, et
Erreur lors de l’attente de la synchronisation de Protractor avec la page: {}
le message ne donne pas beaucoup d'indice.
Je devais passer de ceci:
describe('navigation', function(){
browser.get('');
var navbar = element(by.css('#nav'));
it('should have a link to home in the navbar', function(){
//validate
});
it('should have a link to search in the navbar', function(){
//validate
});
});
faire ceci:
describe('navigation', function(){
beforeEach(function(){
browser.get('');
});
var navbar = element(by.css('#nav'));
it('should have a link to home in the navbar', function(){
//validate
});
it('should have a link to search in the navbar', function(){
//validate
});
});
le diff clé étant:
beforeEach(function(){
browser.get('');
});
espérons que cela pourra aider quelqu'un.
Si vous utilisez
browser.restart ()
dans vos spécifications à quelques reprises, il génère la même erreur
attendez browser.restart ()
Je recevais cette erreur:
Failed: Erreur lors de l’attente de la synchronisation de Protractor avec la page: "window.angular n’est pas défini. Cela peut être soit parce que la page est non angulaire, soit parce que votre test implique une navigation côté client, qui peut interférer avec le démarrage de Protractor. Voir http://git.io/v4gXM pour plus de détails "
La solution consistait à appeler page.navigateTo()
avant page.getTitle()
.
Avant:
import { AppPage } from './app.po';
describe('App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
it('should have the correct title', () => {
expect(page.getTitle()).toEqual('...');
})
});
Après:
import { AppPage } from './app.po';
describe('App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
page.navigateTo();
});
it('should have the correct title', () => {
expect(page.getTitle()).toEqual('...');
})
});