2015-10-12 16 views
6

Mam problem z testami e2e na siatce selenu. Czasami testy powiodło się z powodu Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.Kątomierz/Jasmine2 - asynchroniczne wywołanie zwrotne nie zostało wywołane w określonym czasie

próbowali go rozwiązać jakoś BO zmieniając defaultTimeoutInterval do wyższej wartości w protracotr.conf.js ale w efekcie czas oczekiwania jest dłuższy, ale błąd jest taki sam.

exports.config = { 
    chromeOnly: true, 
    chromeDriver: '../node_modules/.bin/chromedriver', 
    framework: 'jasmine2', 
    capabilities: { 
     'browserName': 'chrome', 
     shardTestFiles: true, 
     maxInstances: 3 
    }, 
    specs: ['../e2e/protractor/spec/*.js'], 
    jasmineNodeOpts: { 
     showColors: true, 
     defaultTimeoutInterval: 30000, 
     isVerbose: true, 
     includeStackTrace: true, 
    }, 

My przykład specyfikacja z niepomyślnym wyniku testu:

var LoginPage = wymagają (”../ stron/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 + ')'); 
    }); 
    }); 

Czy mógłby Pan podać jakieś rozsądne rozwiązanie, jak sobie z tym poradzić/wyjaśnić i wyjaśnić, dlaczego tak się dzieje?

Odpowiedz

6

sugeruję mieć funkcję zwrotną w it bloku, który zapewni, że cały kod asynchroniczny zostanie wykonany przed that.For przykład:

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(); 
    }); 
}); 
+0

Dzięki, mógłbyś napisać jak to będzie spojrzenie w moim kodu? – Michal

+0

@Michal Zmieniono moją odpowiedź. –

+0

IIUC, wywołanie 'done()' powinno znajdować się wewnątrz funkcji 'then()'. – Anton

2

Właściwie, to będzie działać lepiej, jeśli zwrócony obietnicę . Podczas wykonywania pracy asynchronicznej w teście odrywa się od sekwencyjnych oczekiwań kodu. Zasadniczo Twój blok kodu zostanie wykonany i zakończy się jego wywołanie, ale nie będzie żadnych odniesień do obietnicy, która wciąż jest wykonywana w tle. Dzięki temu kątomierz nie może czekać, aż zostanie zakończony (ale wie, że musi czekać), aby test się nie powiódł. Zamiast wykonywania done() ręcznie, wystarczy dodać

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