【发布时间】:2015-07-22 10:46:11
【问题描述】:
有没有办法实现循环,从而可以减少下面的代码?
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]);
}
在哪里expectedValue = ['page1', 'page2', 'page3', 'page4'];
这样做的问题是,for 循环甚至在返回承诺值之前就评估条件,因此循环的内容永远不会执行。
我确定我可以使用 then 并将回调函数附加到 count() 但这只会让事情变得混乱,因为我必须将 navItems 设为全局变量,以便可以通过以下方式访问它回调函数,我还需要确保在执行回调函数之前填充navItems。
我知道expect() 方法以一种非常干净的方式处理承诺,我想实现这样的东西。
【问题讨论】:
标签: javascript angularjs jasmine protractor