web-dev-qa-db-fra.com

"window.angular n'est pas défini." lors de l'utilisation d'un rapporteur pour des tests automatisés?

Il semble y avoir une erreur lors de l'utilisation de l'exemple conf.js fourni avec le rapporteur d'erreurs . J'effectue mes tests avec grunt-protractor-runner, mais l'erreur persiste même lorsque vous utilisez l'exemple de configuration fourni.

Mon Gruntfile.js ressemble à ceci:

/*global module:false*/
module.exports = function(grunt) {
  // Project configuration.
    grunt.initConfig({
      protractor: {
        options: {
          configFile: "smoketest.conf.js", // Default config file
          keepAlive: false, // If false, the grunt process stops when the test fails.
          noColor: false, // If true, protractor will not use colors in its output.
          webdriverManagerUpdate: true,
          args: {
            seleniumServerJar: './node_modules/protractor/Selenium/selenium-server-standalone-2.51.0.jar'
          }
        },
        smoke_test: {   // Grunt requires at least one target to run so you can simply put 'all: {}' here too.
          options: {
            configFile: "smoketest.conf.js", // Target-specific config file
            args: {
              }
          }
        },
        protractor_test: {   // Grunt requires at least one target to run so you can simply put 'all: {}' here too.
            options: {
                configFile: "./node_modules/protractor/example/conf.js", // Target-specific config file
                args: {
                }
            }
        },


      },
    })

  grunt.loadNpmTasks('grunt-protractor-runner');
  // Default task.
  grunt.registerTask('default', ['protractor:smoke_test']);

};

Je suis en cours d'exécution grunt protractor:protractor_test qui utilise ce fichier:

describe('angularjs homepage', function() {
  it('should greet the named user', function() {
    browser.get('http://www.angularjs.org');

    element(by.model('yourName')).sendKeys('Julie');

    var greeting = element(by.binding('yourName'));

    expect(greeting.getText()).toEqual('Hello Julie!');
  });

  describe('todo list', function() {
    var todoList;

    beforeEach(function() {
      browser.get('http://www.angularjs.org');

      todoList = element.all(by.repeater('todo in todoList.todos'));
    });

    it('should list todos', function() {
      expect(todoList.count()).toEqual(2);
      expect(todoList.get(1).getText()).toEqual('build an angular app');
    });

    it('should add a todo', function() {
      var addTodo = element(by.model('todoList.todoText'));
      var addButton = element(by.css('[value="add"]'));

      addTodo.sendKeys('write a protractor test');
      addButton.click();

      expect(todoList.count()).toEqual(3);
      expect(todoList.get(2).getText()).toEqual('write a protractor test');
    });
  });
});

cependant, lorsque cela fonctionne, l'erreur est affichée. 

Error while waiting for Protractor to sync with the page: "window.angular is undefined.  This could be either because this is a non-angular page or because your test involves client-side navigation, which can interfere with Protractor's bootstrapping.  See http://git.io/v4gXM for details"`enter code here`

Je suis allé à http://git.io/v4gXM mais je n'arrive pas à trouver quoi que ce soit pour résoudre mon problème? Quelqu'un d'autre a-t-il eu ce problème, l'exemple de test devrait-il toujours fonctionner?

9
James Trotter

Exclaimer !!: Cela ne répond pas à votre question en tant que telle mais fournit un bidouillage pour la résoudre.

Protractor a besoin de la page Angular pour achever la synchronisation avant de répondre à ses attentes. Par conséquent, pour contourner ce problème, vous pouvez utiliser:

browser.ignoreSynchronization = true;
browser.waitForAngular();
browser.sleep(500); 

Cela indique au navigateur que le rapporteur s'ouvre pour ne pas attendre que Angular se synchronise (ignoreSynchronization), puis qu'il attend que Angulaire termine tout ce qu'il fait, puis il ajoute une attente de 500 millisecondes pour permettre au rapporteur de trouver addButton.click() . Lorsque l'attente est terminée, il force le rapporteur à passer à la ligne de code suivante qui contient votre attente. Avant cela, il s'arrêtait à la ligne addButton.click() et attendait la synchronisation (ce qui ne se produisait pas) avant de continuer.

(Je pense...)

8
Joe

J'ai exactement le même problème (Protractor 3.1.0 avec Jasmine2). Il me semble que la fonction browser.get() de votre appel beforeEach() est à l'origine du problème… .. Copier cette opération pour chaque test pourrait constituer une solution de contournement. 

0
TomVW

j'ai fait face au même problème et cela a résolu pour moi: -

1. downgrade protractor to 3.0.0
2. add jasmine2 in conf.js 
0
RICHA AGGARWAL