使用量角器测试无限滚动

时间:2014-11-04 15:25:08

标签: javascript angularjs protractor ng-grid

我不认为这是严格无限滚动,但与我所看到的相比,这是我能想到的最好的。

无论如何,我们使用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和网络测试相当陌生,所以如果我没有意义,因为我使用了错误的术语或任何让我知道的东西,我会尝试更清楚地解释。

1 个答案:

答案 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');
});

让我知道它是否有效。