7
votes

PROTRACTOR / JASMINE2 - ASYNC Callback non invoqué dans le délai imparti

J'ai lutté dans un problème avec mes tests forts> E2E forts> sur la grille de sélénium. Parfois, les tests sont échoués en raison de xxx pré>

essayé de le résoudre d'une manière ou d'une autre, BO change par défautTimeOnterval code> à une valeur supérieure dans protacotr.conf.js strong> mais En résultat, l'attente est plus longue mais l'erreur est la même. p>

var LoginPage = require('../pages/login_page.js');
var UsersPage = require('../pages/users_page.js');
var WelcomePage = require('../pages/welcome_page.js');

describe('Test -> my test', function () {
  var loginPage;
  var EC = protractor.ExpectedConditions;
  var waitTimeout = 30000;

  function logIn() {
    loginPage.setUser('user');
    loginPage.setPassword('password');
    loginPage.login();
  }

  var clickOn = function (element) {
    browser.wait(EC.visibilityOf(element), waitTimeout).then(function () {
      element.click();
    });
  };

  beforeEach(function () {
    browser.ignoreSynchronization = true;
    loginPage = new LoginPage();
    browser.wait(EC.presenceOf(loginPage.userLogin), waitTimeout);
    logIn();
    var welcomePage = new WelcomePage;
    clickOn(welcomePage.usersButton);
  });

  afterEach(function () {
    var welcomePage = new WelcomePage();
    welcomePage.loginButton.click();
    welcomePage.logoutButton.click();
  });

  it('verifies counter on active tab', function () {
    var usersPage = new UsersPage();
    browser.wait(EC.visibilityOf(usersPage.firstRow), waitTimeout);
    usersPage.rowsCount.count().then(function (count) {
      expect(usersPage.activeTab.getText()).toContain('Active' + ' (' + count + ')');
    });
  });


0 commentaires

3 Réponses :


9
votes

Je suggérerais d'avoir une fonction de rappel dans IT CODE> Block, ce qui garantira que tout le code ASYNC est exécuté avant cela.Pro exemple:

it('verifies counter on active tab', function (done) {
  var usersPage = new UsersPage();
  browser.wait(EC.visibilityOf(usersPage.firstRow), waitTimeout);

  usersPage.rowsCount.count()
    .then(function (count) {
        var text = usersPage.activeTab.getText();
        expect(text).toContain('Active' + ' (' + count + ')');
        done();
     });
});


3 commentaires

Merci, pourriez-vous s'il vous plaît écrir comment ça va regarder dans mon code?


@MICHAL a modifié ma réponse.


IIUC, le terminé () appel doit être à l'intérieur () fonction.



3
votes

En fait, cela fonctionnerait mieux si vous retourniez la promesse. Comme vous le faites asynchronisé, vous travaillez dans votre test, vous vous éloignez des attentes séquentielles du code. Fondamentalement, votre bloc de code sera exécuté et mettre fin à l'appel, mais il n'y aura aucune référence à la promesse qui est toujours exécutée en arrière-plan. Avec cela, le protacteur ne peut pas attendre que cela soit terminé (mais il sait qu'il doit attendre) afin que le test échoue. Au lieu d'exécuter le fait () à la main, il suffit d'ajouter

return usersPage.rowsCount.count().then(function (count) {
  expect(usersPage.activeTab.getText()).toContain('Active' + ' (' + count + ')');
});


0 commentaires

-2
votes

J'ai confronté le même problème alors que E2E Test à l'aide de PROTRACTOR, mais j'ai essayé de changer de protactor.conf.js et cela a fonctionné pour moi.

p>

 jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 180000,
    print: function() {}
  },


0 commentaires