我不认为这是严格无限滚动,但与我所看到的相比,这是我能想到的最好的。
无论如何,我们使用ng-grid在表格中显示数据。我们有大约170个项目(行)要显示。当我们使用ng-grid时,它会创建一个转发器。当我从浏览器中检查这个中继器时,它只限于35个项目,当你向下滚动列表时,你开始丢失dom中的顶行,并在底部添加新行等(因此我为什么不这样做)认为它严格无限滚动,因为通常只会添加更多行)
我很清楚,无论你向下滚动多远,dom中总有35个'ng-repeat=row in rendered rows'
个元素。
在测试之前,这很棒。我需要获取列表中每个项目的文本,但使用element.all(by.binding('item.name'))
或by.repeater或by.css并不会有帮助,因为页面上只有35个项目。
现在我的问题是,我怎么能做到这一点,我可以抓住所有170个项目作为一个对象,然后我可以迭代来获取文本并存储为数组?
在我们少于35个项目的其他页面上iv只使用绑定创建一个对象,然后使用async.js遍历每一行并获取文本(参见下面的示例,它是修改后的提取我知道它可能不会按原样工作,只是为了给你参考)
//column data contains only 35 rows, i need all 170.
var columnData = element.all(by.binding('row.entity.name'))
, colDataTextArr = []
//prevOrderArray gets created elsewhere
, prevOrderArray = ['item1', 'item2'... 'item 169', 'item 170'];
function(columnData, colDataTextArr, prevOrderArray){
columnData.then(function(colData){
//using async to go over each row
async.eachSeries(colData, function(colDataRow, nRow){
//get the text for the current async row
colDataRow.getText().then(function(colDataText){
//add each rows text to an array
colDataTextArr.push(colDataText);
nRow()
});
}, function(err){
if(err){
console.log('Failed to process a row')
}else{
//perform the expect
return expect(colDataTextArr).toEqual(prevOrderArray);
}
});
});
}
顺便说一句,我知道迭代170行并将文本存储在一个数组中并不是非常有效,所以如果有更好的方法可以做到这一点,我可以接受建议。
我对JavaScript和网络测试相当陌生,所以如果我没有意义,因为我使用了错误的术语或任何让我知道的东西,我会尝试更清楚地解释。
答案 0 :(得分:2)
我认为测试网格中的所有行是一种过度的做法。我想测试你得到前几行的值就足够了,如果你绝对需要测试所有的元素,那就用一个evaluate()。
http://angular.github.io/protractor/#/api?view=ElementFinder.prototype.evaluate
不幸的是,api页面中没有代码片段,但它看起来像这样:
// Grab an element where you want to evaluate an angular expression
element(by.css('grid-selector')).evaluate('rows').then(function(rows){
// This will give you the value of the rows scope variable bound to the element.
expect(rows[169].name).toEqual('some name');
});
让我知道它是否有效。