量角器等待多个对象

时间:2015-12-22 17:19:20

标签: javascript angularjs selenium selenium-webdriver protractor

我正在使用AJAX在DOM中加载这样的东西:

<div class="elm_class"></div>
<div class="elm_class"></div>
<div class="elm_class"></div>

然后我需要在量角器测试中等待n个元素。我最好的尝试是:

function needTrue(css,i){
    e = element.all(by.css(css));
    var EC = protractor.ExpectedConditions;
    if(e.length>i){
        return EC.presenceOf($$(".heading-description.uplevel").get(m1I));
    }else{
        return setTimeout(needTrue(css,length),1000);
    }
}

browser.driver.wait(needTrue(".elm_class", 3) , 10000);

但它甚至不会以这种方式抛出错误

  

超出最大调用堆栈大小。

如果有人能解释我怎么能回到等待功能我会很感激&#34;承诺&#34;对象

2 个答案:

答案 0 :(得分:4)

制作一个自定义预期条件,等待匹配选择器元素的n出现:

function presenceOfAll(elements, n) {
    return function () {
        return elements.count(function (count) {
            return count >= n;
        });
    };
}

browser.wait(presenceOfAll($$(".elm_class"), 3) , 10000);

这里需要注意的重要一点是, presenceOfAll会返回browser.wait()执行的函数,直到它解析为true或达到超时为止。< / p>

答案 1 :(得分:2)

browser.wait自动循环到指定的毫秒数,直到它返回true,因此您不想在其中放置setTimeout。此外,您还需要使用.count()而不是.length来查找.all找到的元素数量

function needTrue(css,i){
  e = element.all(by.css(css));

  // count the number of elements found
  return e.count().then(function(elementCount) {
    // if not enough elements, return false so browser.wait will keep looping
    return elementCount >== i;
  });
};

browser.driver.wait(needTrue(".elm_class", 3) , 10000);

// after waiting for the elements, check whatever
// I don't use EC, so I don't know if this part of the code actually works
var EC = protractor.ExpectedConditions;
expect(EC.presenceOf($$(".heading-description.uplevel").get(m1I))).toBe(true);