Angular 6 Jasmine错误:超时 - 在jasmine.DEFAULT_TIMEOUT_INTERVAL

时间:2018-06-12 09:30:18

标签: angular protractor

我无法测试我的应用程序的某些功能,因为有时(通常)量角器测试在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 :(得分:1)

我认为问题在于,您不是在等待异步任务。 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只是使用您的第二天工作来学习它们。