6
votes

Angular 7, rapporteur, erreur aléatoire "la testabilité angularJS et la testabilité angulaire ne sont pas définies"

J'obtiens au hasard l'erreur:

Échec: erreur lors de l'attente de la synchronisation de Protractor avec la page: "la testabilité angularJS et la testabilité angulaire ne sont pas définies. Cela peut être dû au fait qu'il s'agit d'une page non angulaire ou votre test implique une navigation côté client, ce qui peut interférer avec Bootstrapping du rapporteur. Voir https://github.com/angular/protractor/issues/2643 pour plus de détails "

en cours d'exécution

  // Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts

const { SpecReporter } = require('jasmine-spec-reporter');

exports.config = {
  allScriptsTimeout: 11000,
  specs: [
    './src/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'chrome'
  },
  SELENIUM_PROMISE_MANAGER: false,
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function () { }
  },
  onPrepare() {
    require('ts-node').register({
      project: require('path').join(__dirname, './tsconfig.e2e.json')
    });
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  },
};

Dans mon fichier spec.ts, j'ai les 2 tests suivants, le premier fonctionne toujours, le second échoue au hasard avec l'erreur ci-dessus.

import { $, $$ } from 'protractor';

export class MyPage {
  title = $('my-title-selector');
}

Voici MyPage PageObject:

  beforeEach(async () => {
    myPage = new MyPage();
    browser.get('my-page');
  });

  it('should work', async () => {
    console.log('should work');
    expect(true).toBeTruthy();
  });

  it('should display the title', async () => {
    const title = await $('my-title-selector').getText();
    expect(title).toEqual('My-Title');
  });

Voici mon protractor.conf. js

$ ng e2e --webdriverUpdate=false --devServerTarget=

Avez-vous des idées?


0 commentaires

3 Réponses :


1
votes

Si vous utilisez async / await (ce que vous êtes!), vous devrez attendre toutes les promesses. Je suppose donc que votre promesse beforeEach de charger la page n'est pas terminée et que vous recherchez un élément Web qui n'a peut-être pas été amorcé correctement par Protractor.

beforeEach(async () => {
  myPage = new MyPage();
  await browser.get('my-page');   // browser.get returns a webdriver.promise.Promise
});

it('should work', async () => {
  console.log('should work');
  expect(true).toBeTruthy();
});

it('should display the title', async () => {
  const title = await $('my-title-selector').getText();  // <-- this is right, getText returns a webdriver.promise.Promise<string>
  expect(title).toEqual('My-Title');
});

Si vous utilisez Protractor 5.4, il utilise toujours la bibliothèque de flux / promesses de contrôle de sélénium-webdriver et non des promesses natives. Ainsi, le webdriver.promise.Promise provient des typages sélénium-webdriver, de l'espace de noms de promesse, de l'objet Promise. Dans Protractor 6 (lorsqu'il n'est plus en version bêta), cela passera aux promesses natives.

J'espère que cela vous aidera.


8 commentaires

Bonjour, merci, j'ai ajouté SELENIUM_PROMISE_MANAGER: false dans protractor.conf.js afin de désactiver le flux de contrôle / gestionnaire de promesses


Ouais, il semble juste qu'il vous manque une seule instruction d'attente autour du browser.get


J'ai essayé, mais cela ne fonctionne pas, tous les tests se terminent après 11 secondes


Avez-vous juste une spécification? Si tel est le cas, à quoi ressemble votre objet de page.


oui je n'ai qu'une seule spécification, j'ai édité ma question en ajoutant le fichier pageObject


Peut-être désactiver l'attente pour Angular avec "wait waitForAngularEnabled (false);". Cela empêchera l'amorçage et l'attente de testabilité.


ajout de wait browser.waitForAngularEnabled (false); ça marche tout le temps ... Mais je ne sais pas si c'est la bonne solution, qu'en pensez-vous? Cela semble fonctionner même sans waitForAngularEnabled (false) et en supprimant l'attente de await $ ('my-title-selector'). GetText (); mais je suppose que ce n'est pas non plus la bonne solution


Ça dépend. waitForAngular est généralement un signal indiquant que votre application Angular est dans un état "stable". La plupart du temps, c'est à ce moment que la promesse est attendue sur l'action; cependant, si vous remarquez une certaine fragilité parce que votre application n'est pas dans le bon état, vous pouvez utiliser une méthode d'attente browser.wait (pour certaines conditions attendues, 5000); .



0
votes

Votre premier test passera toujours car il n'interagit pas avec l'application et donc ne vérifie pas la testabilité du site angulaire. Votre deuxième test tente cependant d'interagir avec l'application mais semble expirer car la page n'est pas devenue testable à ce stade. C'est également pourquoi vos tests réussissent lorsque waitForAngularEnabled (false) car ils ne vérifient plus la testabilité.

Il pourrait y avoir un problème avec votre page si le code angulaire utilise $ intervalle ou $ timeouts d'une manière particulière. Consultez les mises à jour de la question principale dans le lien ci-dessous et voyez si elles pourraient s'appliquer à votre projet.

Comment déboguer le délai d'attente des tâches angulaires asynchrones? Impossible de trouver des éléments sur la page angulaire


0 commentaires

0
votes

Vous rencontrez peut-être un bogue de condition de concurrence dans l'API Testabilities décrit ici: https: // github.com/angular/angular/issues/15743

Le TL / DR est que - si vous avez un APP_INITIALIZER injecté qui est asynchrone - disons charger un fichier de configuration - il y a une chance que le rapporteur vérifie angulaire 'avant les rapports angulaires qu'il existe. La solution de contournement n'est pas d'attendre angular, mais plutôt d'attendre l'existence d'un élément DOM rendu par l'application angular complète.

Voici un exemple de code:

await browser.wait(ExpectedConditions.urlContains(this.baseUrl));
await browser.waitForAngularEnabled(false);
await browser.wait(ExpectedConditions.visibilityOf($('.main-app-content'), 10000);
await browser.waitForAngularEnabled(true);


0 commentaires