2017-03-26 32 views
1

我正在做一个包含我需要迭代的表格的e2e测试,“直到找到一个不会失败的单击它时。量角器:过滤器直到找到第一个有效元素

我尝试了用filter,它是工作:

this.selectValidRow = function() { 
    return Rows.filter(function (row, idx) { 
     row.click(); 
     showRowPage.click(); 
     return errorMessage.isDisplayed().then(function (displayed) { 
      if (!displayed) { 
       rowsPage.click(); // go back to rows Page, all the rows 
       return true; 
      } 
     }); 
    }).first().click(); 
}; 

这里的问题是,它是迭代所有可用行,而我只需要第一个是有效的(即不显示一个errorMessage)。

我目前的方法存在的问题是,它耗时太长,因为我当前的表可能包含数百行。

是否有可能filter(或不同的方法),并停止迭代时出现第一个有效的发生?或可能有人想出一个更好的方法?

+0

但你怎么知道是一个有效的行?只要点击它,看到没有错误? – Hosar

+0

是的,在我的情况下,我真的需要访问这些行中的一个页面,并且其中一些行会给出错误(因为它们各自的页面不存在或某些内容)。我只想要一种方法来找到一个不会给我一个错误的行。 – eLRuLL

回答

1

你是对的,filter()和其他内置的量角器“函数式编程”方法不会解决“停止迭代时出现第一个有效发生”的情况。您需要“在某些条件评估为真时采取某些元素”(如Python世界中的itertools.takewhile())。

幸运的是,你可以扩展ElementArrayFinder(在onPrepare()最好),并添加takewhile()方法:

请注意,我建议它是内置的,但功能请求仍然打开:

1

如果您偏​​好处理这种情况的非量角器方法,我会建议async.whilst。异步是一个非常流行的模块,它很可能是您的应用程序正在使用它。我在编辑器中编写了下面的代码,但它应该可以工作,您可以根据您的需求对其进行自定义。希望你能了解我在这里做什么。

var found = false, count = 0; 
async.whilst(function iterator() { 
    return !found && count < Rows.length; 
}, function search(callback) { 
    Rows[count].click(); 
    showRowPage.click(); 
    errorMessage.isDisplayed().then(function (displayed) { 
     if (!displayed) { 
      rowsPage.click(); // go back to rows Page, all the rows 
      found = true; //break the loop 
      callback(null, Rows[count]); //all good, lets get out of here 
     } else { 
      count = count + 1; 
      callback(null); //continue looking 
     } 
    }); 
}, function aboutToExit(err, rowIwant) { 
    if(err) { 
     //if search sent an error here; 
    } 
    if(!found) { 
     //row was not found; 
    } 
    //otherwise as you were doing 
    rowIwant.click(); 
});