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
循环。我通过在返回元素时创建期望来编辑我的答案。答案需要解释