Angular 6 Jasmine Error: Timeout - асинхронный обратный вызов не был вызван в течение времени ожидания, указанного в jasmine.DEFAULT_TIMEOUT_INTERVAL - PullRequest
0 голосов
/ 12 июня 2018

Я не могу протестировать некоторые функции моего приложения, потому что иногда (очень часто) тест транспортира завершается неудачно в функции beforeEach.

Возможно, я упускаю что-то важное, потому что тест не проходит случайно, я нашел некоторое обсуждениео максимизации времени ожидания, но это не решает проблему.

Я вижу, что beforeEach не выполняется полностью, когда тест не пройден, выполняется только первая инструкция (browser.get), затембраузер все еще на одной странице.

Я пытаюсь с allScriptsTimeout: 45000, это некоторые тесты.

describe('Rebus', function() {
  // mi posiziono nella lista ticket dopo ogni test e clicco su nuovo ticket

  beforeEach(function() {

    browser.get(Utils.baseUrl + '/tickets');

    browser.wait(function() {
      return element(by.id('newTicket')).isPresent();
    }, 5000);
    element(by.id('newTicket')).click();



    /**Ora passo dalla lista ticket a selezione blocco*/
    browser.wait(function() {
      return element(by.id('0')).isPresent();
    }, 5000);

    element(by.id('0')).click();
    element(by.id('newTicket')).click();
  });

  it('should buy ordinary ticket eurolevel 3', function() {
    // A questo punto dovrei essere arrivato al form del nuovo ticket
    selectArea('0');
    fillLicensePlate(5, 3);
    fillCountry();
    fillPassengers();
    setEntryDate(now);
    setExitDate(now.add(1, 'd'));

    // vai avanti al secondo step
    element(by.id('stepperNext')).click();

    browser.wait(function() {
      return element(by.id('daysOfStay')).isDisplayed();
    }, 5000);

    // Controllo che il prezzo sia corretto e controllo i giorni di permanenza
    element(by.id('daysOfStay'))
      .getText()
      .then(function(text) {
        expect(text).toContain('1');
      });

    element(by.id('amount'))
      .getText()
      .then(function(text) {
        expect(text).toContain('510', 'Errore nella tariffa');
      });

    browser.wait(function() {
      return element(by.id('save')).isDisplayed();
    }, 5000);

    // salvo il ticket
    element(by.id('save')).click();

    // Controllo che il prezzo sia corretto e controllo i giorni di permanenza
    browser.wait(function() {
      return element(by.name('price')).isPresent();
    }, 5000);

    element(by.name('price'))
      .getText()
      .then(function(text) {
        expect(text).toContain('510', 'Errore nella tariffa');
      });

    expect(element(by.name('addPay')).isPresent()).toBeTruthy(
      'Bottone non presente'
    );
  });

  it('should buy HOTEL ticket eurolevel €3', function() {
    // A questo punto dovrei essere arrivato al form del nuovo ticket
    selectArea('0');
    fillLicensePlate(5, 3);
    fillCountry();
    fillPassengers();
    setEntryDate(now);
    setExitDate(now.add(1, 'd'));

    // Campi opzionali
    setHotelField();
    setAgencyField();

    // vai avanti al secondo step
    element(by.id('stepperNext')).click();

    browser.wait(function() {
      return element(by.id('daysOfStay')).isDisplayed();
    }, 5000);

    // Controllo che il prezzo sia corretto e controllo i giorni di permanenza
    element(by.id('daysOfStay'))
      .getText()
      .then(function(text) {
        expect(text).toContain('1');
      });

    element(by.id('amount'))
      .getText()
      .then(function(text) {
        expect(text).toContain('210', 'Errore nella tariffa');
      });

    browser.wait(function() {
      return element(by.id('save')).isDisplayed();
    }, 5000);

    // salvo il ticket
    element(by.id('save')).click();

    // Controllo che il prezzo sia corretto e controllo i giorni di permanenza
    browser.wait(function() {
      return element(by.name('price')).isPresent();
    }, 5000);

    element(by.name('price'))
      .getText()
      .then(function(text) {
        expect(text).toContain('210', 'Errore nella tariffa');
      });

    expect(element(by.name('addPay')).isPresent()).toBeTruthy(
      'Bottone non presente'
    );
  });

1 Ответ

0 голосов
/ 18 июня 2018

Я думаю, что проблема в том, что вы не ждете асинхронных задач.Большинство функций из объекта browser являются асинхронными.Означает, что они выполняются в разных потоках.Поэтому всякий раз, когда вы вызываете асинхронную функцию, она не ждет, пока не завершится.Нет, следующая строка кода выполняется немедленно.Таким образом, в вашем конкретном случае функции browser.get(), browser.wait() и element.click() выполняются практически одновременно, и никогда не ожидали завершения одной функции.Все они работают параллельно, и, как последняя функция завершила, ваши beforeEach() останавливается.

Для ожидания асинхронных задач вы должны работать с Promises Object.Следующий код будет работать в вашем тесте:

beforeEach(function() {
    browser.get(Utils.baseUrl + '/tickets').then(function () {
        // url '/tickets' opened now
        browser.wait(function() {
            return element(by.id('newTicket')).isPresent();
        }, 5000).then(function() {
            element(by.id('newTicket')).click();
           // next task here..
        });
    });
});

Если вы используете машинопись, это можно сделать очень красиво, используя await:

beforeEach(async function() {
    await browser.get(Utils.baseUrl + '/tickets');
    await browser.wait(function() { 
        return element(by.id('newTicket')).isPresent();
    }, 5000);
    await element(by.id('newTicket').click();
    // next task here..
});

При использовании такжеФункции стрелок выглядят почти элегантно:

beforeEach(async () => {
    await browser.get(Utils.baseUrl + '/tickets');
    await browser.wait(() => element(by.id('newTicket')).isPresent()),5000});
    await element(by.id('newTicket').click();
    // next task here..
});

Если вы никогда не слышали о Promises, просто изучите их на следующий рабочий день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...