Javascript 量角器和执行命令
难以理解量角器执行顺序的准确工作方式 如果我有Javascript 量角器和执行命令,javascript,asynchronous,promise,protractor,Javascript,Asynchronous,Promise,Protractor,难以理解量角器执行顺序的准确工作方式 如果我有PageObject:InvitePage 执行顺序的定义如下: InvitePage.EnterUsername() InvitePage.EnterPassword() InvitePage.EnterEmail() InvitePage.Invite(); InviteHelper.waitForEmail() browser.go(invitationUrl) ... expect(somecondition) lastMethodBefo
PageObject:InvitePage
执行顺序的定义如下:
InvitePage.EnterUsername()
InvitePage.EnterPassword()
InvitePage.EnterEmail()
InvitePage.Invite();
InviteHelper.waitForEmail()
browser.go(invitationUrl)
...
expect(somecondition)
lastMethodBeforeWaitForEmail.then(function(){
browser.driver.wait(InvitationHelper.waitForEmail(userEmail))
.then(function(recievedUrl){
...
//methods that I want after
expect(someCondition)
});
});
所有页面方法都返回量角器承诺(例如用于输入密码的browser.sendKeys)
waitForEmail还返回我使用以下方法创建的承诺:
protractor.promise.defer()
问题是,waitForEmail
首先被执行,之后的方法不会等待waitForEmail
完成,我希望通过使用量角器方法创建承诺来实现这一点……无论如何,我找到了解决方案,它看起来像这样:
InvitePage.EnterUsername()
InvitePage.EnterPassword()
InvitePage.EnterEmail()
InvitePage.Invite();
InviteHelper.waitForEmail()
browser.go(invitationUrl)
...
expect(somecondition)
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;
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;
})
然后waitForEmail
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;
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;
}) 在量角器/WebDriverJS中,有一种称为的特殊机制,它基本上是一个承诺队列。如果您有一个“自定义”承诺,为了使其在队列中,您需要: 或:
一个问题和一句话
- 如果要控制执行流,不应该在ControlFlow中放置其他方法吗
- JavaScript引擎添加
需要时,在命令末尾添加code>,但最好自己添加
waitForEmail
中,您已经定义了承诺,但需要将其插入到控制流中。正如您所知,所有正常的webdriver操作click()、getText()等
都已经知道如何按正确的顺序执行,因此您不必将所有承诺都与绑定在一起。然后每次执行
... the bottom of your function should look like this
recursive();
return browser.controlFlow().execute(function() {
return deferred.promise;
});
你丑陋的解决方案lastMethodBeforeWaitForEmail.then(函数()…
之所以有效,是因为这是确保waitForEmail
承诺按正确顺序执行的一种方法,但上面的代码正是您所寻找的漂亮代码。@Marko好的,您能展示一下函数中的内容吗?我已经编辑了问题,添加了waitForEmailmethod@Marko有趣的是,我也有类似的用法在其中一个项目中使用。我们有并通过browser.controlFlow()使用它。wait(helpers.getlastmail(“topic”)。然后(function(email){…};
。对我们有效。你能检查一下may是不是setTimeout()
导致了这里的问题吗?谢谢!1)它们已经在流中,每个都返回量角器。promise,例如browser.sendKeys或element(by.model(…))2)我已禁用在跳过时向我发出警告的atom插件;:D