2015-10-12 52 views
6

我一直在試圖在硒網格上運行我的e2e測試。 有時測試失敗,因爲Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.量角器/ Jasmine2 - 在指定的超時時間內未調用異步回調

試圖解決它在某種程度上改變博來defaultTimeoutInterval更高價值protracotr.conf.js但結果等待較長,但錯誤是一樣的。

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

我的例子規範與失敗的測試:

變種LoginPage =要求(」 ../頁/ 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 + ')'); 
    }); 
    }); 

任何人都可以請提供任何合理的解決方案爲什麼會發生如何處理/避免它和我解釋?

回答

6

我建議有在it塊的回調函數,這將確保所有的異步代碼被that.For例如前執行:

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

謝謝,請問如何在代碼中查看它? – Michal

+0

@Michal修改我的答案。 –

+0

IIUC,'done()'調用應該在'then()'函數內。 – Anton

2

事實上,這將更好地工作,如果你返回的承諾。 由於您在測試中正在進行異步工作,因此您正在擺脫對代碼的連續期望。 基本上,你的代碼塊將被執行,並結束對它的調用,但是不會引用仍在後臺執行的promise。因此,量角器不能等待它完成(但它知道它需要等待),所以測試失敗。 而不是手工執行done(),只需添加

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