我在网页上有一个国家的下拉列表。我需要验证下拉列表中的国家名称是否使用Protractor-Cucumber排序。
我使用element.all()在下拉菜单中找到了所有选项,并在数组上使用了forEach循环。对于每次迭代,它将提取文本并添加到另一个数组中。由于提取文本需要一些时间,因此我得到的数组中的文本顺序与下拉菜单中显示的顺序不同。
element.all(by.css('ul.sbsb_b')).then(function(allOptions){
allOptions.forEach(function(optn){
optn.getText().then(function(text){
result.push(text);
})
})
});
如果我的下拉列表包含A,B,C,D选项,则结果数组应以相同的顺序给我。上述逻辑适用于较少数量的选项。由于异步的性质,我希望forEach一次而不是一次进行迭代。
答案 0 :(得分:0)
我将尝试解决此问题的方法是直接使用ElementArrayFinder
将您的.getText()
转换为字符串数组。我想这会保留订单,但不能肯定地说。
element.all(by.css('ul.sbsb_b')).getText().then(function(allOptions){
console.log(typeof allOptions)
console.log(Array.isArray(allOptions))
}
要执行验证,您可以采用两种方法,它们不需要您提取的状态名称数组的任何特定顺序。
您可以对数组进行排序,然后期望它们相等。
element.all(by.css('ul.sbsb_b')).getText().then(function(allOptions){
expect(allOptions.sort()).toEqual(expectedStates);
}
或者您可以验证所创建的数组与期望状态数组的长度相同,然后验证每个期望状态在创建的数组中至少出现一次
element.all(by.css('ul.sbsb_b')).getText().then(function(allOptions){
expect(allOptions.length).toBe(expectedStates.length);
for(let i = 0; i < expectedStates.length; count++){
expect(allOptions).toContain(expectedStates[i]);
}
}