Javascript、量角器和增量计数器
我之前已经发布了一个类似的问题,但我想让它更加清晰和集中。所以我又在这里写了(或者我应该继续编辑我之前发布的内容?) 我正在使用量角器为angularJS编写e2e测试规范 在量角器规范中,我也使用JavaScript 问题是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';
// 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。