【发布时间】:2016-06-09 17:40:59
【问题描述】:
很难理解 Protractor 的执行顺序是如何工作的。
如果我有PageObject:InvitePage
并且执行顺序是这样定义的:
InvitePage.EnterUsername()
InvitePage.EnterPassword()
InvitePage.EnterEmail()
InvitePage.Invite();
InviteHelper.waitForEmail()
browser.go(invitationUrl)
...
expect(somecondition)
所有页面方法都返回量角器承诺(例如 browser.sendKeys 用于输入密码) waitForEmail 还返回我创建的承诺:
protractor.promise.defer()
问题是waitForEmail 首先执行,之后的方法不等待waitForEmail 完成,我希望通过使用量角器方法创建承诺来实现这一点......无论如何我找到了解决方案并且它看起来像这样:
lastMethodBeforeWaitForEmail.then(function(){
browser.driver.wait(InvitationHelper.waitForEmail(userEmail))
.then(function(recievedUrl){
...
//methods that I want after
expect(someCondition)
});
});
你不觉得很丑吗?
有没有办法更好地做到这一点,有什么建议吗? 我没有得到关于量角器异步性质的哪一部分?我错过了什么吗?
getInvitationEmail
var getInvitationEmail = function (emailAddress){
var deferred = protractor.promise.defer();
mailbox.getEmailsByRecipient(emailAddress, function(err, emails) {
if (err) {
console.log('>Fetch email - call rejected');
deferred.reject(err);
}else{
console.log('>Email service fetched.')
deferred.fulfill(emails);
}
});
return deferred.promise;
};
然后waitForEmail
this.waitForEmail = function(email){
var deferred = protractor.promise.defer();
var timeout;
var interval = 3000;
var timePassed = 0;
var recursive = function () {
var message = '>Checking for invitational email';
if(timePassed>0) {
message = message + ":" + timePassed/1000 + "s";
}
console.log(message);
timePassed += interval;
getInvitationEmail(email).then(function(data){
if(data.length>0){
var loginUrl = data[0].html.links[0].href;
if(interval) clearTimeout(timeout);
console.log(">Email retrieved.Fetching stopped.")
deferred.fulfill(loginUrl);
}else{
console.log(">Still no email.");
}
});
timeout = setTimeout(recursive,interval);
};
recursive();
return deferred.promise;
};
【问题讨论】:
标签: javascript asynchronous promise protractor