【问题标题】:Slicing elements in Protractor在量角器中切片元素
【发布时间】:2016-10-13 00:14:07
【问题描述】:

在 Protractor 中,我们可以通过 index 从数组中获取单个元素:

var elements = element.all(by.css(".myclass"));
elements.get(1);
elements.first();
elements.last();

但是,是否可以以类似的方式从元素数组中切片一个子数组?

理想情况下,我们希望有这样的东西:

var subelements = elements.slice(2, 5);
// subelements is also an ElementArrayFinder
// we can call "filter()", "map()" etc on subelements

我认为我们需要通过定义自定义 protractor.ElementArrayFinder.prototype.slice() 方法来扩展 ElementArrayFinder(类似于 here 的完成方式)。

我也注意到this pull request,但它没有被合并,不再活跃。

【问题讨论】:

    标签: javascript selenium selenium-webdriver automation protractor


    【解决方案1】:

    恐怕没有现成的解决方案。 我相信你可以用 .filter() 实现切片

    首先想到的是:

    function slice (arrayFinder, from, to) {
        return arrayFinder.filter(function(elem, index) {
            if (index >= from && index < to) {
                return true;
            }
        }
    }
    

    【讨论】:

    • @alecxe 不客气,顺便说一句,我喜欢阅读你的量角器答案
    • 谢谢。我正在向你学习。继续发布更多答案!
    • 请尽可能避免使用if (...) {return true;},它会增加一定程度的缩进,并且对于其他开发人员来说阅读起来更加复杂。在这里,您可以使用return index &gt;= from &amp;&amp; index &lt; to;
    【解决方案2】:

    您可以直接在已解决的承诺上使用 slice:

    $$('a')
      .then(elements => elements.slice(3, 8))
      .then(elements => console.log("Count ", elements.length));
    

    你冷也扩展ElementArrayFinder原型:

    protractor.ElementArrayFinder.prototype.slice = function(begin, end) {
      return this.then(elements => elements.slice(begin, end));
    };
    
    $$('a')
      .slice(3, 8)
      .then(elements => console.log("Count ", elements.length));
    

    并带有过滤器:

    $$('a')
      .filter((e, i) => i >= 3 && i < 8)
      .then(elements => console.log("Count ", elements.length));
    

    【讨论】:

    • 那行不通,因为 element() 和 element.all() 返回 ElementFinder 和 ArrayElementFinder 对象,而不是承诺。所以 $$('a').then() 如果没有这种方法就会失败。 .filter() 也返回新的 ArrayElementFinder
    • @Xotabu4,是的,它有效。扩展的.slice 返回一个解析为值数组的承诺。要让它返回和 ArrayElementFinder,就像将 promise 包装在 ArrayElementFinder 的新实例中一样简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多