这是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/

10-12 15:18