量角器等待多个对象

protractor wait for multiple objects

本文关键字:对象 等待 量角器      更新时间:2023-09-26

我正在使用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);

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

超过了最大调用堆栈大小。

如果有人能解释我如何将"promise"对象带回等待函数,我将不胜感激。

创建自定义预期条件以等待出现与选择器元素匹配的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或达到超时。

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);