这是Take elements while a condition evaluates to true (extending ElementArrayFinder)话题的后续问题,特别是@ cvakiitho的回答。
问题:
执行以下代码后:
var i = 0;
var el = element.all(by.css('ul li a'));
var tableItems = [];
(function loop() {
el.get(i).getText().then(function(text){
if(text){
tableItems.push(el.get(i));
i+=1;
loop();
}
});
}());
tableItems
将包含一个ElementFinder
个实例的数组 - 或者,简单来说 - 一个Web元素数组。
问题:
是否可以将ElementFinder
的数组转换为ElementArrayFinder
个实例?
动机:
我希望这样做的原因是拥有所有方便的ElementArrayFinder
功能实用程序,例如map()
,each()
,reduce()
并且能够调用{{1它产生一个将解析为元素文本数组的promise。
答案 0 :(得分:9)
Constructor of ElementArrayFinder
基本上需要两个主要参数:量角器实例和函数getWebElements
,它应该返回一个解析为Web元素数组的promise。只要每个ElementFinder
都有一个方法来获取名为getWebElement
的Web元素,就可以创建这样的函数。
var arrayOfElementFinders = [el1, el2, el3];
var getWebElements = function () {
// create array of WebElements from array of ElementFinders
var webElements = arrayOfElementFinders.map(function (ef) {
return ef.getWebElement();
});
// immediately resolve and return promise
return protractor.promise.fulfilled(webElements);
};
现在,当满足所有要求时,可以创建ElementArrayFinder
的新实例:
var elArrayFinder = new protractor.ElementArrayFinder(protractor, getWebElements);
为了便于使用,我将向ElementArrayFinder
构造函数添加一个静态方法,并在测试开始之前将其包含在某处:
protractor.ElementArrayFinder.fromArray = function (arrayOfElementFinders) {
var getWebElements = function () {
var webElements = arrayOfElementFinders.map(function (ef) {
return ef.getWebElement();
})
return protractor.promise.fulfilled(webElements);
};
return new protractor.ElementArrayFinder(protractor, getWebElements);
};
并在以下测试中使用它:
var elArrayFinder = protractor.ElementArrayFinder.fromArray(arrayOfElementFinders);