打破 Protractor .filter() 或 .map() 循环
Breaking out of a Protractor .filter() or .map() loop
我正在使用量角器和黄瓜框架;如何跳出 .filter 或 .map 循环?如果找到匹配项,我不想继续进一步迭代!
Page.prototype.getElementByKey = function (key) {
var foundElement = null;
return someElement.all(by.css('.someClass')).map(function (rawItem, index) {
var itemObject = new ItemObjectClass(rawItem);
return itemObject.getItemKey().then(function (foundItemKey) {
var matched = String(foundItemKey).trim() === String(key).trim();
console.log(' Matched: { ' + matched + ' } index {'+index+'}');
//if we have a match break out of the .filter function
if (matched) {
foundElement = itemObject;
throw new Error("Just our way of breaking out of .filter() above");
}
});
}).then(function () {
//callback
throw new Error('\n!!!!!Callback should not be called;
this means that we could not find an element that matched the passed in key above');
}, function (error) {
//error
console.log('\n*******************errorCallback was called; '+error);
return foundElement;
});
};
上面的代码找到了元素,但继续迭代直到结束,而不是在有匹配项时停止并通过调用 errorCallback 函数中断。
给定 .map 函数 returns “一个解析为 map 函数返回的值数组的承诺 " http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.map,我正在利用这样一个事实,即如果承诺无法解决,承诺将调用其 errCallback。
通过抛出一个假错误,应该调用 errorCallback 从而跳出 .map 循环。
不幸的是,它成功抛出错误但继续循环而不是中断。我知道,因为当我
console.log("boolean "+matched+" and index "+index);
我明白了:
matched: false index: 0
matched: false index: 1
matched: true index 2 //it should have stopped here since matched = true
matched false index 3 // this should NOT have printed
所以爆发没有任何想法?
您正在 return 单个元素,因此 .reduce
更可取。
这里是 return 第一个 link 的用法示例,其中文本是 "mylink":
var link = element.all(by.css('a')).reduce(function (result, elem, index) {
if(result) return result;
return elem.getText().then(function(text){
if(text === "mylink") return elem;
});
}).then(function(result){
if(!result) throw new Error("Element not found");
return result;
});
我从您的 post 了解到,您希望在找到匹配元素时退出循环(迭代)。
如果是,那么最好使用.filter()方法。当它遍历所有可用的元素查找器列表和 returns 时找到匹配项。
Code Snippet:
element.all(by.css('.items li')).filter(function(elem, index) {
return elem.getText().then(function(text) {
if(text === 'RequiredElementFind'){
return ele;//return matched element
};
});
}).click();//only matched element comes from the loop do what would you like
to do
我正在使用量角器和黄瓜框架;如何跳出 .filter 或 .map 循环?如果找到匹配项,我不想继续进一步迭代!
Page.prototype.getElementByKey = function (key) {
var foundElement = null;
return someElement.all(by.css('.someClass')).map(function (rawItem, index) {
var itemObject = new ItemObjectClass(rawItem);
return itemObject.getItemKey().then(function (foundItemKey) {
var matched = String(foundItemKey).trim() === String(key).trim();
console.log(' Matched: { ' + matched + ' } index {'+index+'}');
//if we have a match break out of the .filter function
if (matched) {
foundElement = itemObject;
throw new Error("Just our way of breaking out of .filter() above");
}
});
}).then(function () {
//callback
throw new Error('\n!!!!!Callback should not be called;
this means that we could not find an element that matched the passed in key above');
}, function (error) {
//error
console.log('\n*******************errorCallback was called; '+error);
return foundElement;
});
};
上面的代码找到了元素,但继续迭代直到结束,而不是在有匹配项时停止并通过调用 errorCallback 函数中断。
给定 .map 函数 returns “一个解析为 map 函数返回的值数组的承诺 " http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.map,我正在利用这样一个事实,即如果承诺无法解决,承诺将调用其 errCallback。
通过抛出一个假错误,应该调用 errorCallback 从而跳出 .map 循环。
不幸的是,它成功抛出错误但继续循环而不是中断。我知道,因为当我
console.log("boolean "+matched+" and index "+index);
我明白了:
matched: false index: 0
matched: false index: 1
matched: true index 2 //it should have stopped here since matched = true
matched false index 3 // this should NOT have printed
所以爆发没有任何想法?
您正在 return 单个元素,因此 .reduce
更可取。
这里是 return 第一个 link 的用法示例,其中文本是 "mylink":
var link = element.all(by.css('a')).reduce(function (result, elem, index) {
if(result) return result;
return elem.getText().then(function(text){
if(text === "mylink") return elem;
});
}).then(function(result){
if(!result) throw new Error("Element not found");
return result;
});
我从您的 post 了解到,您希望在找到匹配元素时退出循环(迭代)。
如果是,那么最好使用.filter()方法。当它遍历所有可用的元素查找器列表和 returns 时找到匹配项。
Code Snippet:
element.all(by.css('.items li')).filter(function(elem, index) {
return elem.getText().then(function(text) {
if(text === 'RequiredElementFind'){
return ele;//return matched element
};
});
}).click();//only matched element comes from the loop do what would you like
to do