如何一次又一次地同步循环迭代

时间:2019-06-17 16:31:06

标签: javascript for-loop foreach protractor

我在网页上有一个国家的下拉列表。我需要验证下拉列表中的国家名称是否使用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一次而不是一次进行迭代。

1 个答案:

答案 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]);
    }
}