从ElementFinders

时间:2015-09-16 04:15:19

标签: javascript selenium testing selenium-webdriver protractor

这是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()并且能够调用{{1它产生一个将解析为元素文本数组的promise。

1 个答案:

答案 0 :(得分:9)

Constructor of ElementArrayFinder基本上需要两个主要参数:量角器实例和函数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);