2017-04-04 10 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

を。これは私のために働いた: 'expect(test.isPresent()).Be(true);' – xsdf

0

これはかなり一般的な現象です。

forループ全体が実行されているので、唯一の最後のノードが返されている(と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; 
       } 
      } 
     });  
} 

nodeおよびiの変数がすべてこの方法ではであり、変更されないように、別の方法で。次にメソッドを呼び出します。

0

あなたはこのような何か試すことができます。これは、私はフィルタが何を指す `ElementFinder`を返さないことを確認する必要がありますテストケースであるので

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); 
関連する問題