Javascript,量角器和增量计数器

时间:2014-10-08 08:21:54

标签: javascript angularjs selenium selenium-webdriver increment

我之前已经发布了一个类似的问题但是想让它更清晰,更专注。所以我在这里再写一次(或者我应该继续编辑之前发布过的那个?)

我正在使用量角器为angularJS编写e2e测试规范。

在量角器规范中,我也使用JavaScript。

问题是JavaScript计数器变量无法正常工作。

我会在这里给你看代码:

// codes here within this describe block made me come back :( call this sample 1

//'use strict';

describe('list page ', function () {
    it('should list page', function () {

        browser.get('/list');

        var counterA = 0;

        element.all(by.repeater('page in pages')).each(function (page) {

            counterA++;
            //console.log(counterA);
        })

        //console.log(counterA);

        // Please be true assertion :(

        expect(counterA).toBeGreaterThan(0);
    })
});

// testing against protractor spec: wrote within the same js file. call this sample 2

bigitems = [["somevalue", "t", "y"], ["somevalue", "somevalue", "y"]];
counterB = 0;

for (smallitems in bigitems) {
    for (item in bigitems[smallitems]) {
        if (bigitems[smallitems][item] == "somevalue") { counterB++; }
    }
}

console.log(counterB)

我注意到的一件事是“样本2”计数器B正在工作并向控制台返回“3”。但是,'sample 1'会在.Aach {}块之外的counterA返回0。

这是控制台输出。

Using the selenium server at http://localhost:4444/wd/hub
3
0
1
2
3
4
5
6
.

Finished in 11.877 seconds
1 test, 1 assertion, 0 failures

再次感谢大家以前帮助过我这个话题。

1 个答案:

答案 0 :(得分:4)

由于Javascript的异步特性,你无法这样做。这是因为 expect 不会等待 element.all.each 完成。

所以你需要使用promises来使它工作。但这里的问题是element.all.each没有返回一个promise(至少还没有,请参阅当前讨论的here)。

有一些替代方案可以解决这个问题。

- 如果你想要的只是计算元素的数量,你可以简单地使用它。

it('sample', function() {
  element.all(by.repeater('page in pages'))
    .then(function(elements){
      return elements.length;
    })
    .then(function(count){
      //console.log("...." + count);
      expect(count).toBeGreaterThan(0);
  });
});

- 或者只是这个。

it('sample', function() {
  expect(element.all(by.repeater('page in pages')).count()).toBeGreaterThan(0);
});

- 如果你真的想手动计算,你也有这个选项,虽然你必须两次调用 element.all

it('sample', function() {
  var count = 0;
  element.all(by.repeater('page in pages'))
  .then(function(){
    element.all(by.repeater('page in pages')).each(function(item){
      count++;
      //console.log(count);
    });
  })
  .then(function(){
    //console.log(count);
    expect(count).toBeGreaterThan(0);
  });
});

- 或者这个。

it('sample', function() {
  var counterA = 0;
  element.all(by.repeater('page in pages'))
    .then(function(elements){
      elements.forEach(function(entry){
        counterA++;
      });
    })
    .then(function(){
        //console.log(counterA);
        expect(counterA).toBeGreaterThan(0);
    });
});

- 或类似的。

it('sample', function() {
  element.all(by.repeater('page in pages'))
    .then(function(elements){
      var counterA = 0;
      elements.forEach(function(entry){
        counterA++;
      });
      return counterA;
    })
    .then(function(counterA){
        //console.log(counterA);
        expect(counterA).toBeGreaterThan(0);
    });
});

希望这有帮助。