问题 从ElementFinders数组中创建ElementArrayFinder


这是一个后续问题 在条件求值为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() 在它上面产生一个可以解析成一系列元素文本的承诺。


10566
2017-09-16 04:15


起源



答案:


构造函数 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);

9
2017-09-17 19:20



令人敬畏,漂亮的可重复使用功能,再次感谢! - alecxe


答案:


构造函数 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);

9
2017-09-17 19:20



令人敬畏,漂亮的可重复使用功能,再次感谢! - alecxe