这是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()
,并能够在其上调用getText()
来产生一个 promise ,该 promise 将分解为元素文本数组。 最佳答案
Constructor of ElementArrayFinder
基本上需要两个主要参数: Protractor 实例和一个函数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);
关于javascript - 从ElementFinders数组制作ElementArrayFinder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32599679/