我正在使用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;对象
答案 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);