2017-04-04 81 views
4

我正在尝试做一些量角器测试,并且承诺没有在for循环中解决。如何在for循环中处理量角器承诺?

在我的测试案例中,我想找到一个ng-repeat元素中的特定节点。

下面是代码找到这样一个节点:

var firstProfileNode = function(nodename, profile){ 
    element.all(by.repeater('node in tree_nodes')).then(function(treeNodes){ 
     for(var i=0; i<treeNodes.length; i++){ 
      var node = treeNodes[i].element(by.css('.tree-dnd-handle')); 
      node.getText().then(function(text){ 

       console.log(i+" : "+text); 
       if (profile){ 
        var pattern = '^' +nodename+' \\(\\d+ devices\\)$'; 
        var regx = new RegExp(pattern); 
        if(regx.test(text)){ 
         console.log('found') 
         return node; 
        } 
       }else{ 
        if(text === nodename){ 
         return node; 
        } 
       } 
       }); 
     } 
    }); 
    }; 
var test = firstProfileNode('ISR', true); 

这里是控制台输出:

23 : edison (4 devices) 
23 : ed21-mbr2 
23 : ed22-mbr1 
23 : ed22-mbr2 
23 : ed21-mbr1 
23 : c2800-12 
23 : L1 (4 devices) 
23 : c887VAM-1 
23 : c891-1 
23 : c887-1 
23 : c3850-1 
23 : ISR (3 devices) 
found 
23 : 3700 (2 devices) 
23 : c3745-2 
23 : c3745-1 
23 : c2921-1 
23 : c2800-11 
23 : N7K (3 devices) 
23 : n7k-2 
23 : n7k-1 
23 : n7k-3 
23 : c2800-13 
23 : c2800-14 

的问题是,对于循环完成后的getText()承诺解决。证据显示,记录的“i”值为23,即最终计数。我正在寻找一种方法让for循环等待承诺或另一种方式来完全找到节点。

回答

2

您期待的代码是从上到下同步执行的,但它实际上是异步的 - 在解决第一个getText()时,循环将结束。

我想你需要的是一个filter()

var firstProfileNode = function(nodename, profile) { 
    return element.all(by.repeater('node in tree_nodes')).filter(function(treeNode) { 
     return treeNode.element(by.css('.tree-dnd-handle')).getText().then(function(text) { 
      if (profile) { 
       var pattern = '^' +nodename+' \\(\\d+ devices\\)$'; 
       var regx = new RegExp(pattern); 
       return regx.test(text); 
      } else { 
       return text === nodename; 
      } 
     }); 
    }).first(); 
}; 

firstProfileNode()函数将返回对应于所需过滤node元素的ElementFinder实例。

+0

由于这是一个测试用例,我需要验证过滤器不会返回'ElementFinder'指向什么。这对我有用:'expect(test.isPresent())。toBe(true);' – xsdf

0

这是一个很常见的情况。

的承诺,决心非同步整个的循环之后已运行并返回,因此只有最后一个节点(和i总是23)

一种常见的做法是封闭的回调(IE)

function fooBar(node, i) { 
     node.getText().then(function(text){ 
      console.log(i+" : "+text); 
      if (profile){ 
       var pattern = '^' +nodename+' \\(\\d+ devices\\)$'; 
       var regx = new RegExp(pattern); 
       if(regx.test(text)){ 
        console.log('found') 
        return node; 
       } 
      }else{ 
       if(text === nodename){ 
        return node; 
       } 
      } 
     });  
} 

在一个单独的方法,以便在该方法中每个nodei变量是closed in scope并且不会更改。然后简单地调用该方法。

0

你可以尝试这样的事情:

var firstProfileNode = function(nodename, profile){ 
    element.all(by.repeater('node in tree_nodes')).then(function(treeNodes){ 
     for(var i=0; i<treeNodes.length; i++){ 
      var node = treeNodes[i].element(by.css('.tree-dnd-handle')); 
      getNodeText(i, node); 
     } 
    }); 
    }; 

var getNodeText = function(i, node) { 
node.getText().then(function(text){ 

       console.log(i+" : "+text); 
       if (profile){ 
        var pattern = '^' +nodename+' \\(\\d+ devices\\)$'; 
        var regx = new RegExp(pattern); 
        if(regx.test(text)){ 
         console.log('found') 
         return node; 
        } 
       }else{ 
        if(text === nodename){ 
         return node; 
        } 
       } 
       });} 
var test = firstProfileNode('ISR', true);