从ElementFinder数组中创建ElementArrayFinder

ale*_*cxe 11 javascript testing selenium selenium-webdriver protractor

当条件评估为true(扩展ElementArrayFinder)主题和@ cvakiitho的答案时,这是Take元素的后续问题.

问题:

执行以下代码后:

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();
        }
    });
}());
Run Code Online (Sandbox Code Playgroud)

tableItems将包含一个ElementFinder实例数组- 或者,简单地说 - 一个web元素数组.

问题:

是否可以将ElementFinders 数组转换为ElementArrayFinder实例?

动机:

我想这样做的原因是让所有的方便ElementArrayFinder功能的实用程序,如map(),each(),reduce()并可以调用getText()它生产这将分解为元素的文本数组的承诺.

Mic*_*nov 10

构造函数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);
};
Run Code Online (Sandbox Code Playgroud)

现在,当满足所有要求时,可以创建一个新实例ElementArrayFinder:

var elArrayFinder = new protractor.ElementArrayFinder(protractor, getWebElements);
Run Code Online (Sandbox Code Playgroud)

为了方便使用,我将向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);
};
Run Code Online (Sandbox Code Playgroud)

并在以下测试中使用它:

var elArrayFinder = protractor.ElementArrayFinder.fromArray(arrayOfElementFinders);
Run Code Online (Sandbox Code Playgroud)