Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在元素上循环并在量角器中单独测试它们_Javascript_Angularjs_Jasmine_Protractor - Fatal编程技术网

Javascript 在元素上循环并在量角器中单独测试它们

Javascript 在元素上循环并在量角器中单独测试它们,javascript,angularjs,jasmine,protractor,Javascript,Angularjs,Jasmine,Protractor,有没有一种方法可以实现循环,从而减少以下代码 var navItems = element.all(by.repeater('item in mc.navItems')); expect(navItems.count()).toEqual(4); expect(navItems.get(0).getText()).toEqual('page1'.toUpperCase()); navItems.get(0).click(); expect(browser

有没有一种方法可以实现循环,从而减少以下代码

    var navItems = element.all(by.repeater('item in mc.navItems'));
    expect(navItems.count()).toEqual(4);

    expect(navItems.get(0).getText()).toEqual('page1'.toUpperCase());
    navItems.get(0).click();
    expect(browser.getLocationAbsUrl()).toEqual('/page1');

    expect(navItems.get(1).getText()).toEqual('page2'.toUpperCase());
    navItems.get(1).click();
    expect(browser.getLocationAbsUrl()).toEqual('/page2');

    expect(navItems.get(2).getText()).toEqual('page3'.toUpperCase());
    navItems.get(2).click();
    expect(browser.getLocationAbsUrl()).toEqual('/page3');

    expect(navItems.get(3).getText()).toEqual('page4'.toUpperCase());
    navItems.get(3).click();
    expect(browser.getLocationAbsUrl()).toEqual('/page4');
我尝试了多种方法,但都失败了,因为我不知道如何让它们等待承诺的值返回

有一种方法失败了:

var navItems = element.all(by.repeater('item in mc.navItems'));
for(var i = 0; i < navItems.count(); i++) {
    expect(navItems.get(i).getText()).toEqual(expectedValue[i].toUpperCase());
    navItems.get(i).click();
    expect(browser.getLocationAbsUrl()).toEqual('/' + expectedValue[i]);
}
var navItems=element.all(by.repeater('mc.navItems'中的项));
对于(var i=0;i
其中
expectedValue=['page1','page2','page3','page4']

这样做的问题是,for循环甚至在返回承诺值之前就评估了条件,因此循环的内容永远不会执行

我确信我可以使用
然后
并将回调函数附加到
count()
但这只会让事情变得一团糟,因为我必须将
navItems
设置为全局变量,以便回调函数可以访问它,并且我还需要确保在执行回调函数之前填充
navItems


我知道
expect()
方法以一种非常干净的方式处理承诺,我希望实现类似的东西。

我正在使用cucumber的量角器,我所做的就是这样

element.all(by.repeater('item in mc.navItems')).then(function (elements) {
  navItems = elements
  var expectations = []
  for (var i = 0; i < navItems.count(); i++) {
    expect(navItems.get(i).getText()).toEqual(expectedValue[i].toUpperCase());
    navItems.get(i).click();
    expectations.push(expect(browser.getLocationAbsUrl()).toEqual('/' + expectedValue[i]));
  }
  Q.all(expectations).should.notify(callback)
})
element.all(通过.repeater('mc.navItems'中的项))。然后(函数(elements){
navItems=元素
var期望值=[]
对于(var i=0;i

因此,测试将等待所有期望执行,然后再通知回调

我认为您遇到的问题不是承诺返回的延迟,而是关闭。看看这里- 您还可以使用带有
if
的递归循环,而不是使用
for
,因为它更简单-

function loop(i){
     if(i>=navItems.count())
              {
                return null;
              }
              else
              {
                expect(navItems.get(i).getText()).toEqual(expectedValue[i].toUpperCase());
        navItems.get(i).click();
        expectations.push(expect(browser.getLocationAbsUrl()).toEqual('/' + expectedValue[i]));
                })
            return loop(i+1)
          }
        }return loop(navItems.count()); 

我不知道在问这个问题时,
each()
方法是否可用,但现在我非常确定
each()
是最好的方法

在上述情况下,答案如下:

var navItems = element.all(by.repeater('item in mc.navItems'));

navItems.each((element, index) => {
  expect(element.getText()).toEqual(('page'+index).toUpperCase());
  element.click();
  expect(browser.getLocationAbsUrl()).toEqual('/page'+index);
});

比单独调用每个元素要好得多

步骤1:首先获取元素列表

let listOfElements = element.all(by.repeater('item in mc.navItems'));    
步骤2:使用下面的行迭代元素

listOfElements.each(function (element, index) {
                    element.getText().then(function (text) {
                        console.log(index, text);
                    });
                });

但是
循环仍然不会执行,因为当循环开始执行时,
navItems.count()
仍然不会等于
navItems
的长度。旁注:我知道我可以只使用
expectedValue.length
,但我想知道在长度未知时如何使用
for
循环。我通过在返回元素时创建期望来编辑我的答案。答案需要解释