【问题标题】:Using protractor to test infinite scrolling使用量角器测试无限滚动
【发布时间】:2014-11-05 07:19:52
【问题描述】:

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

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

【问题讨论】:

    标签: javascript angularjs protractor ng-grid


    【解决方案1】:

    我认为测试网格中的所有行有点过头了。我想测试您是否获得前几行的值就足够了,然后,如果您绝对需要测试所有元素,请使用评估()。

    http://angular.github.io/protractor/#/api?view=ElementFinder.prototype.evaluate

    很遗憾,api 页面中没有代码 sn-p,但它看起来像这样:

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

    让我知道它是否有效。

    【讨论】:

    • 是的,这就是我认为我将不得不辞职的那种,这部分主要是为了测试排序顺序是否正确并相应地改变,它只是我在其他页面上使用这个逻辑和有点懒惰,但我认为你是对的,我将根据选择的排序顺序测试前几行的顺序是否正确,当我实际检查 api 响应时,我将评估绑定,谢谢。标记为正确答案,因为虽然不是我理想中想要的解决方案,但我将要实施的是您提出的方案。
    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2014-10-15
    • 2023-03-29
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多