1

我加載的財產以後像這樣的DOM:量角器等待使用AJAX多個對象

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

,但它甚至不以這種方式工作投擲錯誤

最大調用堆棧大小超出。

我很感激,如果有人能解釋我怎麼能帶回到等待函數「承諾」的對象。

回答

1

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

這個很好。感謝您的幫助和解釋! – shaa

3

做一個定製的預期條件等到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或達到超時。

+0

不錯,正在尋找一種方法來做到這一點。 – Gunderson