Javascript 量角器中映射函数的循环
我有一个angular应用程序,其中我有一个带有列表事件日期和相应事件描述的时间线。这是Html源代码Javascript 量角器中映射函数的循环,javascript,angularjs,protractor,Javascript,Angularjs,Protractor,我有一个angular应用程序,其中我有一个带有列表事件日期和相应事件描述的时间线。这是Html源代码 <!-- timeline --> <h4 class="font-thin m-t-lg m-b-lg text-primary-lt">Historical Timeline</h4> <p></p> <div id="timeline"class="timeline m-l-sm m-r-sm b-info
<!-- timeline -->
<h4 class="font-thin m-t-lg m-b-lg text-primary-lt">Historical Timeline</h4>
<p></p>
<div id="timeline"class="timeline m-l-sm m-r-sm b-info b-l">
<div ng-repeat = "timeline in formattedTimelineData | orderBy : '-eventDate'">
<div class = "tl-item">
<i class="pull-left timeline-badge {{timeline.class}} "></i>
<div class="m-l-lg">
<div id="eventDate{{$index}}" class="timeline-title">{{timeline.eventDate}}</div>
<p id="eventDescription{{$index}}" class="timeline-body">{{timeline.description}}</p>
</div>
</div>
</div>
</div>
<!-- / timeline -->
历史时间线
{{timeline.eventDate}
{{{timeline.description}
现在我基本上在尝试使用量角器来确保正确的事件日期与事件描述相匹配。所以我决定使用map函数。问题是我会有一个变量x,它会告诉我有多少个事件。例如,可以有2个事件、6个事件等。事件是动态的
动态生成,通过查看html代码也可以看出。这是我编写的测试代码
it('FOO TEST', function(){
var x = 0;
while(x<4){
var timeline = element.all(by.css('#timeline')).map(function (timeline) {
return {
date: timeline.element(by.css('#eventDate'+x)).getText(),
events: timeline.element(by.css('#eventDescription'+x)).getText()
}
});
x++
}
timeline.then(function (Value) {
console.log(Value);
});
});
it('FOO TEST',function(){
var x=0;
而(x我建议不要在测试中使用逻辑-
while循环是一种逻辑
你应该提前知道你的时间线中有多少个事件。在示例案例4中,你的规格应该如下所示
element.all(by.css("#timeline")).then(function(events){
expect(events.count).toEqual(4);
expect(events[0].someThing()).toEqual(expectedValue0);
expect(events[1].someThing()).toEqual(expectedValue1);
...
expect(events[3].someThing()).toEqual(expectedValue3);
})
问题在于时间线
定位器:#时间线
匹配时间线容器,而您需要内部重复时间线块。以下是如何匹配它们:
var timeline = element.all(by.repeater('timeline in formattedTimelineData')).map(function (timeline) {
return {
date: timeline.element(by.binding('timeline.eventDate')).getText(),
events: timeline.element(by.binding('timeline.description')).getText()
}
});
timeline.then(function (timeline) {
console.log(timeline);
});
然后,您可以循环处理以下项目:
timeline.then(function (timeline) {
for (var i = 0; i < timeline.length; ++i) {
// do smth with timeline[i]
}
});
在我的例子中,中继器有很多元素。我不想重复所有元素,因为我的量角器规范在循环这么多元素时超时。我怎么能限制循环只在中继器的前10个元素上运行?我已经尝试了很多方法,但我就是无法让它工作。如何只在前10个元素上循环使用map()时中继器的元素
上例中的时间线变量返回中继器中所有元素的数据。如何使时间线变量只包含中继器前10个元素的数据,因为循环中继器的1000个条目非常耗时,这会导致我的量角器规格超时。这将获得所有事件和日期?是的,它会是的,我投了更高的票,并肯定地接受了你的答案,因为它是有效的。但现在的问题是,如果我想做某种循环,循环通过每个索引,并进行此检查,这是可能的吗?我知道你发布的解决方案肯定是“更好的”方法,但我只是好奇我是否想通过循环来实现它,因为我尝试了如何实现它?如果你能在你的答案下面添加它,那么这将是非常棒的!关键是,我可以对每个事件进行单独的测试,如果可能的话,还可以对每个事件进行描述。它(‘事件1测试’),它(‘事件2测试’)依此类推。@Dineroeach()
可能也与用例有关。我认为您无法动态创建it()
块。嗯,那么有没有办法单独检查每个块呢?也许可以动态描述每个事件?我发布了一个新问题,您可能可以帮助我解决
expect(timeline).toEqual([
{
date: "First date",
events: "Nothing happened"
},
{
date: "Second date",
events: "First base"
},
{
date: "Third date",
events: "Second base"
},
]);