在量角器中以条件开始循环

时间:2016-03-29 15:03:06

标签: while-loop protractor

我需要像while()那样的重复块,它在执行之前验证条件。我的代码在下面,但是while不起作用......

if (j == 0)
{
    printf("|%d",i); //you want to print i here, not j
}
printf("| "); //put the blank printing after the number

如何更换while,但仍然需要相同的结果?

3 个答案:

答案 0 :(得分:2)

我至少部分同意alecxe。一些"等待"订单应该解决。我只是想解释一下我的想法,希望它对你有用......因为我花了很多时间在这类问题上^^。

对我而言,最重要的是Protractor以异步方式运行所有内容。 当您运行测试时,Protractor基本上可以运行代码的每个部分,即直到遇到承诺。当遇到承诺时,量角器可以做两件事,这取决于你是否设置了browser.ignoreSynchronization = true;(这是我的情况)

  1. 如果确实如此,Protractor会创建一个新线程并等待承诺得到解决,但是在"主线程"量角器继续执行您的代码。如果你想要Protractor等待某事,你必须明确地写它。
  2. 如果它是假的(默认情况下是这种情况),量角器将在继续之前添加browser.waitForAngular。但是,您当然可以在代码中添加明确的等待命令,在某些情况下您可能希望这样做以获得更稳定的代码。
  3. 如果您想了解更多相关信息,请阅读this post

        var foundPersonen = true;
            while (foundPersonen){
               detailPage.getAllPersonen().then(function(value) {
               if (value.length == 0) {
                  foundPersonen = true;
                  remoteControl(Keys.HK_BACK);
                  remoteControl(Keys.HK_P_up);
                  remoteControl(Keys.HK_INFO, 1, 3000);
               } 
               else {
                  foundPersonen = false;
               }            
           }
    

    就我而言(browser.ignoreSynchronization = true;),会发生以下情况:

    1. 为布尔值分配一位内存并将值设置为1;
    2. 评估位
    3. 如果是1

      创建一个帖子。在这个线程中,创建一个promise并等待它被解析,然后用promise的值做一些事情

      在主线程中,返回第2步

    4. 如果为0,请继续
    5. 这种解释导致了一个简单的预测。由于将布尔值设置为0的代码在之后处理处理了承诺,因此这段代码将尽可能快地创建承诺,直到其中一个承诺得到解决并将布尔值设置为false

      结果呢?在解决第一个承诺之前,您的代码将达到最大内存。 - >您将收到一些与内存分配相关的异常。

      我用这段代码测试过:

          return scenariiSteps.AtlasLogin("my", "credentials")
          .then(function () {
      
              var foundDialogs = element.all(by.xpath("//div[@dialog-id]"));
              var foundDialogsZero = true;
              while (foundDialogs) {
                  foundDialogs.count().then(function (value) {
                      if (value == 0) {
                          foundDialogsZero = true;
                          console.log("0, man")
                      }
                      else {
                          console.log("Found something!")
                          foundDialogsZero = false;
                      }
                  });
              }
          });
      

      此代码的作用是

      1. 登录
      2. 为某个对象分配内存(它将存储我应用页面中对话框的列表)
      3. 为布尔值分配一位内存并将其设置为false。
      4. 评估位
      5. 如果是1

        创建承诺并等待其解决,然后使用承诺的价值做一些事情

        返回第4步

      6. 并且,为了确保我的解释,请注意我的应用程序在用户登录后包含2个对话框。

        我想,我收到了FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

        "好的,谢谢你的长篇解释,但是......我现在应该怎么做?"

        基本上你必须告诉Protractor在执行你想要的动作之前等待某些条件。最好的方法取决于您的要求和您的环境。例如,我不认为alecxe的解决方案可以解决我环境中的问题。

        如果您需要更多帮助,了解更多关于您想要做的事情会很有用。

答案 1 :(得分:1)

是的,因为量角器继续将所有内容添加到控制流中,所以像这样的块不能按预期工作。尝试在函数中递归调用它。

function keepChecking(){ while (foundPersonen) { detailPage.getAllPersonen().then(function(value) { if (value.length == 0) { foundPersonen = true; remoteControl(Keys.HK_BACK); remoteControl(Keys.HK_P_up); remoteControl(Keys.HK_INFO, 1, 3000); keepchecking(); } else { foundPersonen = false; } }); } } keepchecking();

答案 2 :(得分:0)

我认为您可以使用browser.wait()解决问题:

browser.wait(function () {
    return detailPage.getAllPersonen().count().then(function (count) {
        if (count == 0) {
            remoteControl(Keys.HK_BACK);
            remoteControl(Keys.HK_P_up);
            remoteControl(Keys.HK_INFO, 1, 3000);
            return false;  
        }
        else {
            return true;
        }
    }
}, 10000);

当计数为0时,这将执行条件功能最多10秒。如果为0,则执行远程控制功能。请测试。