2015-10-12 23 views
6

Selmum ızgarasında e2e testlerimin çalışmasında sorun yaşadım. Bazen testler nasılsa protracotr.conf.js yüksek değere defaultTimeoutInterval değişen bo ama sonuçta beklemek daha uzundur ancak hata aynıdır bunu çözmek için çalıştıİletici/Yasemin2 - async geri çağırma belirtilen zaman aşımı içinde çağrılmadı

nedeniyle Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. başarısız olan. Başarısız testi ile

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, 
    }, 

Benim örnek numuneleri:

var LoginPage = gerektirir (' ../ sayfa/login_page.js'); var UsersPage = gerekli ('../ pages/users_page.js'); var WelcomePage = gerekli ('../ 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 + ')'); 
    }); 
    }); 

Herhangi biri, bunun nasıl ele alınacağını/nasıl önleneceğini ve neden oluştuğunu açıklayan herhangi bir makul çözüm sunabilir mi?

cevap

6

Bütün zaman uyumsuz kod that.For örnek önce işletilirse sağlayacaktır it bloğunda bir geri çağırma işlevi olması öneririm: Eğer söz döndü eğer

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

Teşekkür eklemek yapılır, bunu benim kodunda gözükecek nasıl yazınız olabilir yürütme ? – Michal

+0

@Michal Cevabımı değiştirdi. –

+0

IIUC, 'done()' çağrısının 'o()' işlevi içinde olması gerekir. – Anton

2

Aslında bu daha iyi çalışacak . Testinizde asenkron çalışma yaparken, kodun sıralı beklentilerinden uzaklaşıyorsunuz. Temel olarak, kod bloğunuz yürütülür ve çağrıyı sonlandırır, ancak arka planda hala yürütülmekte olan vaatlere referans olmayacaktır. Bununla birlikte, iletki tamamlanmadan bekleyemez (ancak beklemesi gerektiğini bilir) bu nedenle test başarısız olur. Bunun yerine() elle, sadece

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