这是一个后续问题 在条件求值为true时获取元素(扩展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()
在它上面产生一个可以解析成一系列元素文本的承诺。
构造函数 ElementArrayFinder
基本上需要两个主要参数:量角器实例和函数 getWebElements
,它应该返回一个解析为Web元素数组的promise。每一个 ElementFinder
有一个方法来调用它的Web元素 getWebElement
,可以创建这样的功能。
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);
构造函数 ElementArrayFinder
基本上需要两个主要参数:量角器实例和函数 getWebElements
,它应该返回一个解析为Web元素数组的promise。每一个 ElementFinder
有一个方法来调用它的Web元素 getWebElement
,可以创建这样的功能。
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);