Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 量角器和执行命令_Javascript_Asynchronous_Promise_Protractor - Fatal编程技术网

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引擎添加
    ,但最好自己添加

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