Protractor/Jasmine2 - 未在指定超时内调用异步回调
Protractor/Jasmine2 - async callback not invoked within specified timeout
我在 selenium 网格上运行的 e2e 测试遇到了问题。
有时测试会因
而失败
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
试图以某种方式解决它,将 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,
},
我的测试失败示例规范:
var LoginPage = require('../pages/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 + ')');
});
});
任何人都可以提供任何合理的解决方案如何 handle/avoid 并解释为什么会发生吗?
我建议在 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();
});
});
实际上,如果您返回承诺,效果会更好。
当您在测试中执行异步工作时,您正在脱离代码的顺序期望。
基本上,你的代码块将被执行,并结束它的调用,但不会有对仍在后台执行的承诺的引用。
这样,protractor 就不能等待它完成(但它知道它需要等待)所以测试失败。
不要手动执行 done(),只需添加
return usersPage.rowsCount.count().then(function (count) {
expect(usersPage.activeTab.getText()).toContain('Active' + ' (' + count + ')');
});
我在使用量角器进行端到端测试时遇到了同样的问题,但我尝试更改 protractor.conf.js 它对我有用。
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 180000,
print: function() {}
},
如果我们将 defaultTimeOutInterval 增加到大于完成测试用例执行所需的时间,则此方法可能有效
我在 selenium 网格上运行的 e2e 测试遇到了问题。 有时测试会因
而失败Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
试图以某种方式解决它,将 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,
},
我的测试失败示例规范:
var LoginPage = require('../pages/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 + ')');
});
});
任何人都可以提供任何合理的解决方案如何 handle/avoid 并解释为什么会发生吗?
我建议在 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();
});
});
实际上,如果您返回承诺,效果会更好。 当您在测试中执行异步工作时,您正在脱离代码的顺序期望。 基本上,你的代码块将被执行,并结束它的调用,但不会有对仍在后台执行的承诺的引用。 这样,protractor 就不能等待它完成(但它知道它需要等待)所以测试失败。 不要手动执行 done(),只需添加
return usersPage.rowsCount.count().then(function (count) {
expect(usersPage.activeTab.getText()).toContain('Active' + ' (' + count + ')');
});
我在使用量角器进行端到端测试时遇到了同样的问题,但我尝试更改 protractor.conf.js 它对我有用。
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 180000,
print: function() {}
},
如果我们将 defaultTimeOutInterval 增加到大于完成测试用例执行所需的时间,则此方法可能有效