有麻烦,以了解究竟是如何量角器为了执行工程..量角器和执行
如果我有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;
};
hm,不起作用,waitForEmail在之前的方法之前执行... – Marko
@Marko好的,你能不能展示函数内部是什么? – alecxe
我编辑了这个问题,添加了waitForEmail方法 – Marko