Javascript、量角器和增量计数器

Javascript、量角器和增量计数器,javascript,angularjs,selenium,selenium-webdriver,increment,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';

我之前已经发布了一个类似的问题,但我想让它更加清晰和集中。所以我又在这里写了(或者我应该继续编辑我之前发布的内容?)

我正在使用量角器为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”计数器正在工作,并将“3”返回控制台但是,示例1'为计数器A外部返回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

再次感谢大家之前在这个话题上帮助过我的人。由于Javascript的异步特性,您不能这样做。这是因为expect不等待element.all.each完成

所以你需要用承诺来实现它。但这里的问题是element.all.each并没有返回承诺(至少还没有,请参阅当前的讨论)

有几种方法可以让这项工作正常进行

-如果你只想计算元素的数量,你可以简单地使用这个

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

希望这能有所帮助。

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

所以你需要用承诺来实现它。但这里的问题是element.all.each并没有返回承诺(至少还没有,请参阅当前的讨论)

有几种方法可以让这项工作正常进行

-如果你只想计算元素的数量,你可以简单地使用这个

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

希望这有帮助。

元素
返回一个
承诺
,它是
异步的
,那么console.log外部元素将不会在
之后被调用。每个
但是在中间的某个地方,异步不应该仍然触发++操作符吗??根据expect(counterA),每个{}之外的counterA仍然为零;错误消息:预期0大于0。它会,但显然在第一个计数器A++之前调用了console.log外部元素,您可以
setTimeout(function(){console.log(counterA)},200)
,这可能会记录其他值,因为此时元素将触发
++
,直到无法获取它为止。有人能告诉我如何使这个断言成为真的吗?
expect(element.all(by.repeater('page in pages')).count()).toBeGreaterThan(0)
这样行吗?
element
返回一个
promise
异步的
然后console.log-outside元素将不会在
之后被调用。每个
元素都会在中间的某个地方,异步不应该仍然触发++运算符吗??根据expect(counterA),每个{}之外的counterA仍然为零;错误消息:预期0大于0。它会,但显然在第一个计数器A++之前调用了console.log外部元素,您可以
setTimeout(function(){console.log(counterA)},200)
,这可能会记录其他值,因为此时元素将触发
++
,直到无法获取它为止。有人能告诉我如何使这个断言成为真的吗?
expect(element.all(by.repeater('page in pages'))).count()).toBeGreaterThan(0)
这不管用吗?它确实帮了我很大的忙。我没有使用前两个选项,因为我有一个内部循环,它需要在增量之前检查“if”条件。我使用了elements.forEach选项。结果很好!最后非常感谢。但现在我的循环看起来很冗长,我开始想也许量角器没有设置为手动解析“承诺”,因为我的循环看起来像find.button.then->click.then->find.elements.then->get text.then->if match counter++->。。。然后期待柜台比>更大,非常感谢你们给我提供了有价值的信息,并感谢你们给莫里西。它确实帮助了我很多。我没有使用前两个选项,因为我有一个内部循环,它需要在增量之前检查“if”条件。我使用了elements.forEach选项。结果很好!最后非常感谢。但现在我的循环看起来很冗长,我开始想也许量角器没有设置为手动解析“承诺”,因为我的循环看起来像find.button.then->click.then->find.elements.then->get text.then->if match counter++->。。。然后期待柜台比>更大,非常感谢你们给我提供了有价值的信息,并感谢你们给maurycy。