我们什么时候应该将 .then 与 Protractor Promise 一起使用?
When should we use .then with Protractor Promise?
我在使用 Protractor 时遇到了很多不稳定性,而且我肯定有一些我不明白的地方。
有时我需要在继续之前单击按钮时使用 .then() ,有时它没有任何影响,我不应该使用 .then() 否则测试失败。
我想知道在 Protractor 中测试时应该什么时候使用 .then() 回调?
示例:
createAccountForm = $('#form-create-account');
submitButton = createAccountForm.$('button[type=submit]');
browser.wait(EC.elementToBeClickable(submitButton), 5000);
submitButton.click(); // .then(function(){ <-- uncomment in the .then form
// find the confirmation message
var message = $('.alert-success');
browser.wait(EC.visibilityOf(message), 5000);
log.debug('After visibilityOf');
expect(message.isPresent()).to.be.eventually.true;
// }); --> uncomment when in .then form
当我使用这种形式的测试时(没有 .then())我在浏览器上看到 点击按钮没有完成 ,测试继续下面的期望然后停止。
如果我使用 .then() 表单,按钮的点击完成,测试继续没有错误。
在其他测试中,我不需要在点击按钮时使用 then() 回调。
那么,什么时候应该使用 .then() 什么时候不应该?
让-马克
这个问题的答案可以在这个post中找到:http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/
即:
- 量角器将所有驱动程序命令排入 ControlFlow,
- 当您需要驱动程序命令的结果时,您应该使用 .then,
- 当你不需要驱动程序的结果时,你可以避免 .then 但所有
以下指令必须在 ControlFlow 中排队,否则它们
将在队列中的命令之前 运行 导致不可预测
结果。所以,如果你想 运行 一个非驱动程序测试命令,你应该将它添加到 .then 回调中,或者将测试包装到 Promise 中并将测试放入 ControlFlow 中。请参阅下面的示例。
这是我在没有 .then 的情况下工作的测试示例:
log.debug('test0');
// enqueue the click
submitButton.click();
var message = $('.alert-success');
// enqueue the wait for message to be visible
browser.wait(EC.visibilityOf(message), 5000);
log.debug('test1');
// enqueue a test
expect(message.isPresent()).to.be.eventually.true;
log.debug('test2');
// a function returning a promise that does an async test (check in MongoDB Collection)
var testAccount = function () {
var deferred = protractor.promise.defer();
// Verify that an account has been created
accountColl.find({}).toArray(function (err, accs) {
log.debug('test5');
expect(err).to.not.exist;
log.debug('test6');
expect(accs.length).to.equal(1);
return deferred.fulfill();
});
return deferred.promise;
};
log.debug('test3');
// Enqueue the testAccount function
browser.controlFlow().execute(testAccount);
log.debug('test4');
输出现在是我们所期望的:
test0
test1
test2
test3
test4
test5
test6
给自己一个忙,避免.then
今天,async/await
更适合处理承诺
但简而言之,打开量角器 API 页面 https://www.protractortest.org/#/api,找到您要使用的方法并查看它 returns。如果它说 promise,只需在调用它之前添加 await
。确保使您的包装功能 async
it('test case 1', async () => {
await elem.click()
})
我在使用 Protractor 时遇到了很多不稳定性,而且我肯定有一些我不明白的地方。 有时我需要在继续之前单击按钮时使用 .then() ,有时它没有任何影响,我不应该使用 .then() 否则测试失败。
我想知道在 Protractor 中测试时应该什么时候使用 .then() 回调? 示例:
createAccountForm = $('#form-create-account');
submitButton = createAccountForm.$('button[type=submit]');
browser.wait(EC.elementToBeClickable(submitButton), 5000);
submitButton.click(); // .then(function(){ <-- uncomment in the .then form
// find the confirmation message
var message = $('.alert-success');
browser.wait(EC.visibilityOf(message), 5000);
log.debug('After visibilityOf');
expect(message.isPresent()).to.be.eventually.true;
// }); --> uncomment when in .then form
当我使用这种形式的测试时(没有 .then())我在浏览器上看到 点击按钮没有完成 ,测试继续下面的期望然后停止。
如果我使用 .then() 表单,按钮的点击完成,测试继续没有错误。
在其他测试中,我不需要在点击按钮时使用 then() 回调。
那么,什么时候应该使用 .then() 什么时候不应该?
让-马克
这个问题的答案可以在这个post中找到:http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/
即:
- 量角器将所有驱动程序命令排入 ControlFlow,
- 当您需要驱动程序命令的结果时,您应该使用 .then,
- 当你不需要驱动程序的结果时,你可以避免 .then 但所有 以下指令必须在 ControlFlow 中排队,否则它们 将在队列中的命令之前 运行 导致不可预测 结果。所以,如果你想 运行 一个非驱动程序测试命令,你应该将它添加到 .then 回调中,或者将测试包装到 Promise 中并将测试放入 ControlFlow 中。请参阅下面的示例。
这是我在没有 .then 的情况下工作的测试示例:
log.debug('test0');
// enqueue the click
submitButton.click();
var message = $('.alert-success');
// enqueue the wait for message to be visible
browser.wait(EC.visibilityOf(message), 5000);
log.debug('test1');
// enqueue a test
expect(message.isPresent()).to.be.eventually.true;
log.debug('test2');
// a function returning a promise that does an async test (check in MongoDB Collection)
var testAccount = function () {
var deferred = protractor.promise.defer();
// Verify that an account has been created
accountColl.find({}).toArray(function (err, accs) {
log.debug('test5');
expect(err).to.not.exist;
log.debug('test6');
expect(accs.length).to.equal(1);
return deferred.fulfill();
});
return deferred.promise;
};
log.debug('test3');
// Enqueue the testAccount function
browser.controlFlow().execute(testAccount);
log.debug('test4');
输出现在是我们所期望的:
test0
test1
test2
test3
test4
test5
test6
给自己一个忙,避免.then
今天,async/await
更适合处理承诺
但简而言之,打开量角器 API 页面 https://www.protractortest.org/#/api,找到您要使用的方法并查看它 returns。如果它说 promise,只需在调用它之前添加 await
。确保使您的包装功能 async
it('test case 1', async () => {
await elem.click()
})