从elementfinder的数组中创建ElementArrayFinder

Making ElementArrayFinder from an array of ElementFinders

本文关键字:创建 ElementArrayFinder 数组 elementfinder      更新时间:2023-09-26

这是一个在条件求值为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 s数组转换为ElementArrayFinder实例?

的动机:

我想要这样做的原因是拥有所有方便的ElementArrayFinder功能实用程序,如map(), each(), reduce(),并能够调用getText()在它上产生一个承诺,将解析为元素文本数组。

ElementArrayFinder的构造函数基本上需要两个主要参数:量角器实例和函数getWebElements,它应该返回一个解析到Web元素数组的承诺。只要每个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);