我正在尝试做一些量角器测试,并且在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()promise在for循环完成后解析.记录的’i’值是最终计数23,可以看出这一点.我正在寻找一种方法让for循环等待承诺或另一种方式来完全找到节点.
最佳答案 您希望代码可以从上到下同步执行,但它实际上是异步的 – 在第一次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()函数将返回对应于所需过滤节点元素的ElementFinder
实例.