2015-12-15 54 views
6

我编写量角器自动化测试并面临一个问题。 Wait command实际上并不等待其中一个数组元素。看下面的例子:我尝试等待导航到网页后的第一个元素。量角器:'等待'不适用于“element.all”

var category = element.all(by.repeater('category in listCtrl.categories')); 
var category2 = $$('.category-name.custom-tooltip-link.ng-binding'); 
var EC = protractor.ExpectedConditions; 

describe('wait for the first category', function() { 

    it('wait', function() { 
     browser.get('http://www.deep.mg/'); 

     browser.wait(EC.visibilityOf(category.get(0)), 20000); 

     browser.wait(EC.visibilityOf(category2.get(0)), 20000); 
    }); 
}); 

但测试失败,出现以下错误:Failed: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator by.repeater("category in listCtrl.categories")

错误不依赖于定位器类型,因为两者都出现:“by.repeater”和“by.css”。 的选择都OK,测试将“休眠”命令后经过:

var category = element.all(by.repeater('category in listCtrl.categories')); 
var category2 = $$('.category-name.custom-tooltip-link.ng-binding'); 
var EC = protractor.ExpectedConditions; 

describe('wait for the first category', function() { 

    it('wait', function() { 
     browser.get('http://www.deep.mg/'); 

     browser.sleep(15000); 

     browser.wait(EC.visibilityOf(category.get(0)), 20000); 

     browser.wait(EC.visibilityOf(category2.get(0)), 20000); 

     category.count().then(function(count1) { 
      console.log(count1); //count returns 5, which means there are actually elements in array 
     }); 

     category2.count().then(function(count2) { 
      console.log(count2); 
     }); 
    }); 
}); 

而且超时参数没有帮助,它只是忽略了它,并立即失败。

所以问题是如何等待数组的某个元素?我错过了什么吗?谢谢。

+0

答案有帮助吗?谢谢。 – alecxe

+0

@alecxe是的,它有。谢谢! –

回答

8

做一个定制的预期条件等待元素的计数数组大于0:

function presenceOfAll(elementArrayFinder) { 
    return function() { 
     return elementArrayFinder.count(function (count) { 
      return count > 0; 
     }); 
    }; 
} 

用法:

browser.wait(presenceOfAll(category), 10000); 
browser.wait(presenceOfAll(category2), 10000); 

为我工作。

+0

感谢@alecxe这是我头痛的问题。我们是否应该一直使用ElementFinder或者只有在得到StaleReference错误时才使用它? – DDave

+0

@Dave我会考虑将它作为一种可靠性添加层,将其注入测试中的问题点。很高兴帮助! – alecxe

+1

就我而言,我不得不延长答案。回调函数(count)...根本不被考虑。将其留空会导致相同的结果。 Count正在返回一个承诺,你必须使用。然后像这样 'return elementArrayFinder.count()。then(function count(){... //在这里做你的检查})' – ilmgb

2

element.all(by.repeater('category in listCtrl.categories')).get(0)如果存在对 '得到' 没有元素将总是抛出一个错误(来源:element.js ElementArrayFinder.prototype.get)

你可以这样做:

browser.wait(function() { 
    return category.count().then(function(catCount) { 
     if (catCount > 0) { 
      return EC.visibilityOf(category.get(0)); 
     } 
    } 
}, 20000); 

或者你可以大概等到所有的元素都可见时,它会做你正在要求它做的事情(因为它会等待“全部”承诺完全解决,不仅仅是当它得到第一个时就发生):

browser.wait(EC.visibilityOf(category), 20000);